我有一个活动类,其中使用导航组件添加了一个片段。我在活动中添加了OnAuthStateChangeListener
,以查看用户何时注销。我已经实现了这样的方法:
override fun onAuthStateChanged(isUserSignedOut: Boolean) {
if (!isUserSignedOut) {
sharedViewModel.setUid(uid)
}
}
我的SharedViewModel
类看起来像这样:
class SharedViewModel @Inject constructor(): ViewModel() {
val liveData = MutableLiveData<String>()
fun setUid(uid: String) {
liveData.value = uid
}
}
现在在我的片段中,我试图像这样获取uid:
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
sharedViewModel.liveData.observe(viewLifecycleOwner, Observer<String> { uid ->
logErrorMessage("uid: $uid")
})
}
但是那个观察者从不解雇。我在logcat中没有任何输出。如何正确获取该uid?
答案 0 :(得分:1)
因此,经过长时间的讨论,
之所以发生这种情况,是因为“活动”和“片段”中sharedViewModel
的实例不同。
您需要像向Dagger提供注释那样添加@Singleton
注释,
@Module
abstract class AppViewModelModule {
@Singleton
@Binds
abstract fun bindAppViewModelFactory(factory: AppViewModelFactory?): ViewModelProvider.Factory?
@Singleton
@Binds
@IntoMap
@ViewModelKey(SharedViewModel::class)
abstract fun provideSharedViewModel(viewModel: SharedViewModel?): ViewModel?
}
还要像这样向@Singleton
类添加SharedViewModel
注释
@Singleton
class SharedViewModel @Inject constructor(): ViewModel() {
val liveData = MutableLiveData<String>()
fun setUid(uid: String) {
liveData.value = uid
}
}
很高兴为您提供了帮助:)