我使用的是在Google I/O2018上展示的Android导航,我似乎可以通过绑定到某个视图或使用NavHost从片段中获取它来使用它.但是,我需要根据几个条件从我的第一个片段导航到ViewModel中的另一个特定视图.对于ViewModel,我延长了AndroidViewModel,但是我不知道下一步该怎么做.我不能将getApplication强制转换为片段/活动,也不能使用NavHostFragment.另外,我不能只将导航绑定到onClickListener,因为startFragment只包含一个ImageView.我如何从ViewModel开始导航?

class CaptionViewModel(app: Application) : AndroidViewModel(app) {
private val dealerProfile = DealerProfile(getApplication())
val TAG = "REGDEB"


 fun start(){
    if(dealerProfile.getOperatorId().isEmpty()){
        if(dealerProfile.isFirstTimeLaunch()){
            Log.d(TAG, "First Time Launch")
            showTour()
        }else{
            showCodeFragment()
            Log.d(TAG, "Show Code Fragment")

        }
    }
}

private fun showCodeFragment(){
    //??
}

private fun showTour(){
    //??
}

}

我的碎片

class CaptionFragment : Fragment() {
private lateinit var viewModel: CaptionViewModel
private val navController by lazy { NavHostFragment.findNavController(this) }

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
    viewModel = ViewModelProviders.of(this).get(CaptionViewModel::class.java)
    return inflater.inflate(R.layout.fragment_caption, container, false)
}


override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    viewModel.start()

}

}

I want to keep logic of navigation in ViewModel

推荐答案

如何从ViewModel导航?

The answer is please don't. ViewModel is designed to store and manage UI-related data.

New Answer

In my previous answers, I said that we shouldn't navigate from ViewModel, and the reason is because to navigate, ViewModel must have references to Activities/Fragments, which I believe (maybe not the best, but still I believe it) is never a good idea.

But, in recommended app architecture from Google, it mentions that we should drive UI from model. And after I think, what do they mean with this?

所以我查看了一个来自"android架构"的示例,我发现了一些有趣的方式,谷歌是如何做到这一点的.

Please check here: todo-mvvm-databinding

事实证明,他们确实是drive UI from model人.但是怎么做呢?

  1. 他们创建了一个界面TasksNavigator,基本上只是一个导航界面.
  2. 然后在TasksViewModel中,他们引用了TaskNavigator,这样他们就可以在不直接引用活动/片段的情况下驱动UI.
  3. Finally, TasksActivity implemented TasksNavigator to provide detail on each navigation action, and then set navigator to TasksViewModel.

Kotlin相关问答推荐

在Spring Boot应用程序中使用网络请求功能将关键字挂起作为冗余

在 Kotlin 中,我可以在集合上有一个条件构建器元素吗?

Jetpack Compose - 单击 LazyColumn 的项目时应用程序崩溃

如果不为空,则为 builder 设置一个值 - Kotlin

Kotlin:查找集合中最常见的元素

@InlineOnly 注释是什么意思?

IntelliJ 不会根据 ktlint 的期望对 Kotlin 导入进行排序

Kotlin 中 lambda 表达式中的默认参数

为什么我在使用 Jetpack Compose clickable-Modifier 时收到后端内部错误:Exception during IR lowering error?

如何使用Kotlin Dokka记录主构造函数参数

Kotlin 的类型具体化使哪些在 Java 或 Scala 中无法实现的成为可能?

如何使用kotlin中的反射查找包中的所有类

在Kotlin中传递并使用函数作为构造函数参数

用mockk验证属性设置程序吗?

当被Spring代理类访问时,Kotlin实例变量为null

使用 Kotlin 创建自定义 Dagger 2 范围

Kotlin 接口属性:只需要公共 getter 而没有公共 setter

Kotlin - computed var 属性的用处?

安装 Kotlin-Jupyter:e: java.lang.NoClassDefFoundError: 无法初始化类 org.jetbrains.kotlin.com.intellij.pom.java.LanguageLevel

Kotlin 对象 vs 伴生对象(companion-object) vs 包作用域(package scoped)方法