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)
}
}
NavigationCommand
class看起来像
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
.
的片段中覆盖它
我有一个 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)
}
}
NavigationCommand
class看起来像
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
.