【问题标题】:Android send ViewModel to Fragment via NavDirections arguement (Safe-Args)Android 通过 NavDirections 争论(Safe-Args)将 ViewModel 发送到 Fragment
【发布时间】:2020-06-29 03:01:11
【问题描述】:

我有一个具有以下架构的应用:

  • Navigator 是一个自定义类,包含 NavController
  • Cooridnator 持有 Navigator
  • Cooridnator 告诉 Navigator “启动” framgent 并将 ViewModel 传递给它
  • Navigator 要求 NavController 导航到 NavDirections 并提供所需的参数(使用 Safe-Args)

现在这里的问题是,如果我想发送 ViewModel 作为参数,它需要是 Parcelable 以及它的所有底层类(这将使我的大部分代码 Parcelable,这并不是真正需要的) .

那么有没有办法做到这一点而不使所有东西都可以 Parcelable 或使用 Dagger ? (不喜欢 Dagger,因为它给代码增加了太多的复杂性......)

我可以在 Fragment 中有一个 lateinit 字段并手动设置它,但似乎无法从 NavDirections 访问 Fragment

知道我该怎么做吗?

【问题讨论】:

    标签: android kotlin dependency-injection android-architecture-navigation android-safe-args


    【解决方案1】:

    首先:您传递的安全参数是“数据”,而您的视图模型是逻辑。这意味着您的数据可能会随着时间而改变(其中一个例子是过时的),但只要视图模型没有改变,它的逻辑就会保持不变。因此,传递视图模型本身对我来说没有意义——你最好传递它的状态快照,但我怀疑这就是你想要的。

    所以,是的,您应该使用 DI,并且有替代匕首复杂性的方法。您可以尝试使用 koin(因为我在您的标签列表中看到了 kotlin),这里有一些关于它的基本功能https://shorturl.at/bflFL(中)。您还可以尝试将 Hilt 作为 Dagger 的简化替代品,适用于 Android 世界。

    【讨论】:

    • 哦,对了,确实错过了关于安全参数的那部分......(我对 Android 和 Kotlin 有点陌生)。谢谢,我会检查 koin !可以肯定的是,没有办法通过例如公共属性将 viewModel 传递给 Fragment ?
    • 你当然可以这样做,但是从内部开始——因为片段有它自己的生命周期。更多这里developer.android.com/reference/android/arch/lifecycle/…
    • 但是在使用 NavController/NavDirections 时我们无法访问片段,那么您将如何做到这一点?
    • 我最终使用了 Koin,比 Dagger 更容易理解和使用!
    猜你喜欢
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多