如何使用 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?
}

另外,给SharedViewModelclass加上@Singleton注解,像这样

@Singleton
class SharedViewModel @Inject constructor(): ViewModel() {
    val liveData = MutableLiveData<String>()

    fun setUid(uid: String) {
        liveData.value = uid
    }
}

很高兴这对你有帮助:)