如何使用 SharedViewModel 在 activity 和片段之间共享数据?
How to share data between an activity and a fragment using a SharedViewModel?
我有一个 activity class,我在其中添加了一个使用导航组件的片段。我在我的 activity 中添加了一个 OnAuthStateChangeListener
以查看用户何时注销。我已经实现了这样的方法:
override fun onAuthStateChanged(isUserSignedOut: Boolean) {
if (!isUserSignedOut) {
sharedViewModel.setUid(uid)
}
}
我的 SharedViewModel
class 看起来是这样的:
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?
所以经过长时间的讨论,
发生这种情况是因为 Activity 和 Fragment 中 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?
}
另外,给SharedViewModel
class加上@Singleton
注解,像这样
@Singleton
class SharedViewModel @Inject constructor(): ViewModel() {
val liveData = MutableLiveData<String>()
fun setUid(uid: String) {
liveData.value = uid
}
}
很高兴这对你有帮助:)
我有一个 activity class,我在其中添加了一个使用导航组件的片段。我在我的 activity 中添加了一个 OnAuthStateChangeListener
以查看用户何时注销。我已经实现了这样的方法:
override fun onAuthStateChanged(isUserSignedOut: Boolean) {
if (!isUserSignedOut) {
sharedViewModel.setUid(uid)
}
}
我的 SharedViewModel
class 看起来是这样的:
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?
所以经过长时间的讨论,
发生这种情况是因为 Activity 和 Fragment 中 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?
}
另外,给SharedViewModel
class加上@Singleton
注解,像这样
@Singleton
class SharedViewModel @Inject constructor(): ViewModel() {
val liveData = MutableLiveData<String>()
fun setUid(uid: String) {
liveData.value = uid
}
}
很高兴这对你有帮助:)