作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个看起来像这样的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()
}
})
}
}
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
类看起来像
sealed class NavigationCommand {
data class To(val destinationId: Int) : NavigationCommand()
data class BackTo(val destinationId: Int): NavigationCommand()
object Back: NavigationCommand()
object ToRoot: NavigationCommand()
}
BaseViewModel
的viewModel中,我希望能够调用
navigate(R.id.action_fragmentA_to_fragmentB)
,但问题是
observeNavigationCommands()
中的使用者从未收到NavigationCommands
observeNavigationCommands()
的内容并将其放在我当前的片段(扩展了
BaseFragment
的片段)中,则消费者会收到更新
最佳答案
我是否正确理解,对于您的扩展了BaseFragment
的片段,您想附加一个扩展了BaseViewModel
的viewModel,但不适用于liveData吗?
如果是这样,请查看我创建以反射(reflect)您的情况的这个简单的工作项目:
https://github.com/phamtdat/OpenViewModelDemo
关键是使viewModel
可覆盖,并在扩展BaseFragment
的片段中覆盖它。
关于android - BaseFragment中的LiveData使用者未从BaseViewModel接收更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65260061/
我有一个公共(public)库需要在我的主要 WPF 应用程序及其插件之间共享... 在公共(public)库中,我有一个带有此代码的 BaseViewModel public Dispatc
我对 MVC5 有点陌生,我尝试使用以下答案中显示的方法在整个项目中设置全局变量: Razor MVC, where to put global variables that's accessible
我是一名优秀的程序员,十分优秀!