Android通过NavDirections参数(安全参数)将ViewModel发送到Fragment

Android通过NavDirections参数(安全参数)将ViewModel发送到Fragment,android,kotlin,dependency-injection,android-architecture-navigation,android-safe-args,Android,Kotlin,Dependency Injection,Android Architecture Navigation,Android Safe Args,我有一个具有以下体系结构的应用程序: Navigator是一个保存NavController Cooridnator持有Navigator Cooridnator告诉Navigator启动框架并将ViewModel传递给它 Navigator要求NavController导航到NavDirections并提供所需的参数(使用安全参数) 现在的问题是,如果我想将ViewModel作为参数发送,它需要是可打包的,并且它的所有底层类也需要打包(这将使我的大部分代码可以打包,而实际上并不需要) 那么

我有一个具有以下体系结构的应用程序:

  • Navigator
    是一个保存
    NavController
  • Cooridnator
    持有
    Navigator
  • Cooridnator
    告诉
    Navigator
    启动框架并将
    ViewModel
    传递给它
  • Navigator
    要求
    NavController
    导航到
    NavDirections
    并提供所需的参数(使用安全参数)
现在的问题是,如果我想将
ViewModel
作为参数发送,它需要是可打包的,并且它的所有底层类也需要打包(这将使我的大部分代码可以打包,而实际上并不需要)

那么,有没有一种方法可以做到这一点,而不必把所有东西都打包或使用匕首?(不喜欢Dagger,因为它给代码增加了太多的复杂性…)

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


你知道我该怎么做吗?

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


所以,是的,您应该使用DI,并且有替代匕首复杂性的方法。您可以尝试使用koin(因为我在您的标记列表中看到了kotlin),这里有一些关于它的基本轮廓(中等)。对于android世界,你也可以尝试将剑柄作为Dagger的简化替代品。

哦,没错,没有提到关于安全args的部分…(我对android和Kotlin有些陌生)。谢谢,我会查一下koin!可以肯定的是,没有办法通过公共属性(例如)将viewModel传递给片段?当然可以,但是可以从内部传递,因为片段有自己的生命周期。这里有更多内容,但我们在使用NavController/NavDirections时无法访问该片段,因此您将如何操作?我最终使用了Koin,Wayyy,比Dagger更容易理解和使用!