BaseFragment 中的 LiveData Consumer 未从 BaseViewModel 接收更新

LiveData Consumer in BaseFragment not receiving updates from BaseViewModel

我有一个 BaseFragment.kt 看起来像这样

open class BaseFragment: Fragment() {

private lateinit var viewModel: BaseViewModel

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    viewModel = ViewModelProvider(this).get(BaseViewModel::class.java)
    observeNavigationCommands()
}

/**
 * Method that observes Navigation commands triggered by BaseViewHolder
 * This allows us to navigate from a viewHolder using the MVVM pattern
 */
private fun observeNavigationCommands() {
    viewModel.navigationCommands.observe(viewLifecycleOwner, EventObserver {
        Timber.e("received nav command $it")
        when(it) {
            is NavigationCommand.To -> findNavController().navigate(it.destinationId)
            is NavigationCommand.Back -> findNavController().popBackStack()
            is NavigationCommand.BackTo -> TODO()
            NavigationCommand.ToRoot -> TODO()
        }
    })
}

}

...还有一个看起来像这样的 BaseViewModel.kt

open class BaseViewModel: ViewModel() {

val navigationCommands = MutableLiveData<Event<NavigationCommand>>()

/**
 * Navigate to a specific fragment using Id
 */
fun navigate(id: Int) {
    Timber.e("trigger navigation event $id")
    // navigationCommands.postValue(NavigationCommand.To(id))
    navigationCommands.value = Event(NavigationCommand.To(id))
}

/**
 * Pop backStack
 */
fun goBack() {
    navigationCommands.value = Event(NavigationCommand.Back)
}

}

NavigationCommandclass看起来像

sealed class NavigationCommand {

data class To(val destinationId: Int) : NavigationCommand()
data class BackTo(val destinationId: Int): NavigationCommand()

object Back: NavigationCommand()
object ToRoot: NavigationCommand()

}

现在在我扩展 BaseViewModel 的其他视图模型中,我希望能够调用 navigate(R.id.action_fragmentA_to_fragmentB) 但问题是 observeNavigationCommands() 中的消费者从未收到 NavigationCommands

.....

但是如果我复制 observeNavigationCommands() 的内容并将其放入我当前的片段(扩展 BaseFragment 的片段),消费者会收到更新

我错过了什么?请帮助

我是否理解正确,对于扩展 BaseFragment 的片段,您想附加一个扩展 BaseViewModel 的 viewModel,但这对 liveData 不起作用?

如果是这样,请查看我为反映您的情况而创建的这个简单的工作项目:

https://github.com/phamtdat/OpenViewModelDemo

重点是使 viewModel 可覆盖并在扩展 BaseFragment.

的片段中覆盖它