如何使用SharedViewModel在活动和片段之间共享数据?

时间:2020-08-07 15:07:05

标签: android kotlin android-livedata android-viewmodel android-architecture-navigation

我有一个活动类,其中使用导航组件添加了一个片段。我在活动中添加了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?

1 个答案:

答案 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
    }
}

很高兴为您提供了帮助:)