【问题标题】:Android MVVM architecture - Android references/imports in ViewModelAndroid MVVM 架构 - ViewModel 中的 Android 引用/导入
【发布时间】:2018-05-01 12:02:58
【问题描述】:

基于您不应该将 Android 视图或其他纯 Android 组件传递给 ViewModel,或者在那里有 android 导入的想法,请考虑下一个用例:

在我的Fragment 中,我想启动某种图像处理操作,为此我需要使用我想要显示结果的当前 xml 视图来初始化我的对象。所以我用视图组件在``片段端创建它,然后将该对象传递给ViewModel

我的问题是:

  1. 我正在向ViewModel 传递一个已引用 Android 视图的对象。

  2. ViewModel 中的逻辑创建了一个 Bitmap,并在处理后将该位图返回给观察它的 Fragment,因此我在我的 ViewModel 中引用了一些 Android 位图库

如果我需要在那里完成工作,如何避免在 ViewModel 中引用 Android 内容?

【问题讨论】:

  • 你好,你能制定一个清晰的问题陈述吗?
  • @Stefan 更新
  • 好吧,如果您需要在那里完成工作,那么很难不参考 android 的东西。我认为主要问题是:你想在你的 ViewModel 中完成工作还是你想使用你的 ViewModel 来触发动作?
  • 部分处理涉及到一些第三方库,这就是为什么我不想把它扔到视图部分
  • 虽然我绝对不是安卓专家,但我通常做的是为您想到的处理创建一个抽象接口,将逻辑包装在一个包含实际转换的具体类中,然后将该对象作为接口传递给 ViewModel。这样,您就可以将所有依赖项限制为单个具体的。

标签: android mvvm android-mvvm


【解决方案1】:

如果我理解正确,您在Fragment 中夸大您的视图,然后在ViewModel 中生成位图,然后将其传回并设置在您的Fragment 中,并在此过程中您需要向ViewModel 传递更多内容,而不仅仅是Application 实例。如果是这种情况,您需要使用ViewModelFactory。简而言之,您将编写一个为您创建ViewModel 的小类,然后将其作为第二个参数传递给ViewModelProviders.of(this, ...)

用法见this答案。如果您环顾四周,您还应该能够在Google samples 中找到它的用法。

【讨论】:

  • 是的,你对第一个部分是正确的,至于工厂的想法,我不确定我是否需要它,因为我可以调用该方法并传递我想要的任何东西。我真正的问题是我最终得到了一个 ViewModel,它引用了诸如 import android bitmap 之类的 Android 内容,不建议这样做。我不需要使用Application
  • @RonTr 是的,所以它不会引入泄漏。好吧,在那种情况下,我的回答没有多大意义:) 您需要在 ViewModel 和 View 之间建立某种存储库层。也许如果您的位图是从 API 或数据库生成的,您可以在 ViewModel 和数据库或您从中获取图像的源之间引入一个存储库层,这可能有助于抽象。但除此之外我不知道。如果找到解决方案,请务必发布:)
猜你喜欢
  • 2017-10-24
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 2017-11-28
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多