在android mvvm中处理导航

在android mvvm中处理导航,android,mvvm,viewmodel,android-livedata,Android,Mvvm,Viewmodel,Android Livedata,我正在构建一个android应用程序,我不确定如何在MVVM架构中实现导航。 我采取的第一种方法是将单击事件按钮绑定到ViewModel中的一个函数,该函数在必要时执行一些逻辑(例如一些数据验证),然后向观察ViewModel的视图触发一个LiveData事件(通知视图导航到不同的屏幕) 类MyViewModel:ViewModel(){ val saveNavigation=MutableLiveData() val errorMessage=MutableLiveData() 乐趣与快乐

我正在构建一个android应用程序,我不确定如何在MVVM架构中实现导航。 我采取的第一种方法是将单击事件按钮绑定到ViewModel中的一个函数,该函数在必要时执行一些逻辑(例如一些数据验证),然后向观察ViewModel的视图触发一个LiveData事件(通知视图导航到不同的屏幕)


类MyViewModel:ViewModel(){
val saveNavigation=MutableLiveData()
val errorMessage=MutableLiveData()
乐趣与快乐{
if(验证客户){
repository.save(客户)
saveNavigation.value=事件(客户)
}
其他的
errorMessage.value=事件(“错误”)
}
}
类视图:片段(){
覆盖已创建的视图(视图:视图,保存状态:捆绑?){
//观察事件防止在屏幕旋转时重新读取值
myViewModel.saveNavigation.ObserveeEvent(此){
findNavController()。导航(CustomServiceWidDirections
.actionCustomerInfoToCustomerBalanceHistory(it))
}
myViewModel.errorMessage.ObserveeEvent(this){toast(it)}
}
}
第二种方法是,视图注册到onClickListener,并主动调用ViewModel逻辑函数(例如验证),然后视图才执行导航

类MyViewModel:ViewModel(){
fun save():状态{
if(验证客户){
repository.save(客户)
返回状态。确定
}
其他的
返回状态。错误//或某些字符串消息
}
}
类视图:片段(){
覆盖已创建的视图(视图:视图,保存状态:捆绑?){
btnId.setOnClickListener{
if(myViewModel.save()==Status.OK)
findNavController()。导航(CustomServiceWidDirections
.actionCustomerInfoToCustomerBalanceHistory(myViewModel.customer))
其他的
吐司(“错误”)
}
}
}

这两种方法中哪一种更适合MVVM体系结构,或者可能还有另一种选择?

我建议您创建一个导航器界面,使用您选择的依赖项注入将其注入到ViewModels中。然后在处理导航的组件中实现该接口。然后使用导航器界面中的方法进行导航

比如说,

interface Navigator {
    fun navigateToSettings()
}

class NavigatorImpl : Navigator {
    override fun navigateToSettings() {
        TODO()
    }
}

如何获取
NavController
内部
NavigatorImpl
的引用?我在视图中使用
view.findNavController().navigate(actionId)
(从ViewModel笨拙地重新路由到clickListener中的视图)