【发布时间】:2021-08-24 16:58:54
【问题描述】:
我的应用使用 MVVM 架构。我有一个 Activity 及其子片段之一共享的 ViewModel。 ViewModel 包含一个简单的字符串,我想从 Activity 更新并在片段中观察。
我的问题很简单:LiveData 更新后,我的片段中永远不会到达观察回调。为了测试,我尝试观察MainActivity 中的数据,但效果很好。此外,观察我在其他 ViewModel 中声明的片段中的 LiveData 变量也可以正常工作。奇怪的是,只有这个 ViewModel 的 LiveData 似乎对我的片段造成了问题。
我正在声明 ViewModel 并通过 Koin 将其注入到我的 Activity 和 Fragment 中。我做错了什么,永远不会在我的片段中获取此 ViewModel 数据的更新?
视图模型
class RFIDTagViewModel: ViewModel() {
private val _rfidTagUUID = MutableLiveData<String>()
val rfidTagUUID: LiveData<String> = _rfidTagUUID
fun tagUUIDScanned(tagUUID: String) {
_rfidTagUUID.postValue(tagUUID)
}
}
活动
class MainActivity : AppCompatActivity(), Readers.RFIDReaderEventHandler,
RFIDSledEventHandler.TagScanInterface {
private val rfidViewModel: RFIDTagViewModel by viewModel()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
rfidViewModel.rfidTagUUID.observe(this, {
Timber.d("I'm ALWAYS reached")
})
}
override fun onResume() {
rfidViewModel.tagUUIDScanned(uuid) //TODO: data passed in here, never makes it to Fragment observer, only observed by Activity successfully
}
}
片段
class PickingItemFragment : Fragment() {
private val rfidViewModel: RFIDTagViewModel by viewModel()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
rfidViewModel.rfidTagUUID.observe(viewLifecycleOwner, { tagUUID ->
Timber.d("I'm NEVER reached")
})
}}
Koin DI 配置
val appModule = module {
viewModel { RFIDTagViewModel() }
}
【问题讨论】:
标签: android mvvm viewmodel android-livedata koin