【问题标题】:Fragment Never Receives LiveData updates from Shared ViewModelFragment 从不接收来自共享 ViewModel 的 LiveData 更新
【发布时间】: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


    【解决方案1】:

    在您的片段中,我看到您使用的是viewModels()viewModels() 这里将附加到 Fragment,而不是 Activity。

    如果你想在 Fragment 和 Activity 之间共享 ViewModel,那么在 Fragment 中你使用activityViewModels()。现在,在 Fragment 中,您的 shareViewModel 将附加到包含您的 Fragment 的 Activity。

    编辑如下:

    PickingItemFragment.kt

    class PickingItemFragment : Fragment() {
        private val rfidViewModel: RFIDTagViewModel by activityViewModels()
    }
    

    更多信息:Communicating with fragments

    【讨论】:

      【解决方案2】:

      您需要使用相同的视图模型,也就是 sharedViewModel,就像您使用同一视图模型的两个不同实例一样。

      修复它。

      关于活动和片段:

      private val rfidViewModel: RFIDTagViewModel by activityViewModels()
      

      https://developer.android.com/topic/libraries/architecture/viewmodel?hl=pt-br

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-17
        • 2022-11-10
        相关资源
        最近更新 更多