Android 共享livedata观察者在片段和活动之间不工作

Android 共享livedata观察者在片段和活动之间不工作,android,android-livedata,observer-pattern,android-viewmodel,koin,Android,Android Livedata,Observer Pattern,Android Viewmodel,Koin,我有一个viewmodel,它是在我的MainActivity中通过Koin库实例化的- class SharedInformationViewModel:ViewModel(){ val deviceId:MutableLiveData=MutableLiveData() } 类MainActivity:AppCompatActivity(){ 私有val sharedInformationViewModel:sharedInformationViewModel by inject() 重写创

我有一个viewmodel,它是在我的MainActivity中通过Koin库实例化的-

class SharedInformationViewModel:ViewModel(){
val deviceId:MutableLiveData=MutableLiveData()
}
类MainActivity:AppCompatActivity(){
私有val sharedInformationViewModel:sharedInformationViewModel by inject()
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
binding=DataBindingUtil.setContentView(this,R.layout.activity\u main)
setContentView(binding.root)
sharedInformationViewModel.deviceId.observe(此,{deviceId->
//无论我做什么,这都不是所谓的!
val x=5
})
}
我在另一个片段中更改了'deviceId'的值-

类设置片段:片段(){
私有val sharedInformationViewModel:sharedInformationViewModel by inject()
覆盖已创建的视图(视图:视图,保存状态:捆绑?){
super.onViewCreated(视图,savedInstanceState)
//这里有很多代码。。。
if(deviceId!=活动?.SharedReferences?.deviceId){
sharedInformationViewModel.deviceId.value=deviceId
活动?.SharedReferences?.deviceId=deviceId
wasSettingsDataChanged=true
}
}
值确实正在更改,但从未调用观察者

我不知道是什么错了,我错过了什么

尝试使用Koin的“get()”方法而不是“by inject()”,但没有帮助。

您需要使用

// Activity
private val sharedInformationViewModel: SharedInformationViewModel by viewModel()

// Fragment
private val sharedInformationViewModel: SharedInformationViewModel by sharedViewModel()

根据,viewModel应初始化为:

 //Use the 'by activityViewModels()' Kotlin property delegate
 // from the fragment-ktx artifact

 private val model: SharedViewModel by activityViewModels()

谢谢。你能解释一下为什么需要这样做,以及我所做的工作之间有什么区别吗?这取决于模块中最初是如何定义的,这实际上没有包含在问题中。它的定义与你建议的定义方式相同。这不使用Koin,提问者肯定会这样做。因此dn无法从Koin正确传递参数和其他对象实例。
 //Use the 'by activityViewModels()' Kotlin property delegate
 // from the fragment-ktx artifact

 private val model: SharedViewModel by activityViewModels()