场景
我有一个测验生成器,它生成一系列不同类别的测验。该序列的长度不受限制。
测验生成器有一个 View 模型。每种类型的测验都有一个 View 模型。测验生成器 View 模型应根据测验的类创建测验的 View 模型。
问题
View 模型不得包含对生命周期的引用,但我需要生命周期来创建 View 模型。
ViewModelProviders.of(lifecycle).get(classForQuizzType);
问题
在哪里创建测验的 subview 模型?
我能想到的一个解决方案是每次从 Activity 中注入(inject) subview 模型。这是一种绕道,特别是在涉及嵌套 View 的情况下。
另一个解决方案是在嵌套 View 中创建 View 模型,这看起来也很难看,因为从 View 内部访问生命周期并不常见。
如果没有干净的解决方案,我的架构方法有什么问题?我应该在这种情况下使用 fragment 吗?
最佳答案
受 pskink
启发,我自己给出了第一个答案。也许我会在使用建议的方法一些经验后更新答案。
如果 View 模型应生成子对象(即组件),则组件不需要绑定(bind)到生命周期本身,只要主对象绑定(bind)到生命周期并且从主对象引用组件即可。
对于给定的示例,这意味着创建主对象的好位置是 Activity 的顶层位置,其中生命周期
可直接使用。测验对象是从主对象引用的。它们不需要直接访问生命周期,并且可以在任何地方创建,例如在主对象内。这使得能够按需创建它们。
组件可能是也可能不是ViewModel
的子类。我认为扩展 ViewModel 是一个很好的做法。该父类引入了 onCleared 方法。这是从底层模型中删除观察者的地方。如果不这样做,您可能会造成内存泄漏。
您必须注意在正确的时刻调用 onCleared
,至少是从主对象的 onCleared
方法调用。在这种特殊情况下,必须在生成新测验之前清除每个先前的测验,以从基础测验模型中删除引用。
可以使用new
关键字简单地创建组件的 View 模型。无需使用工厂或提供商。
关于android - 如何生成具有临时 subview 的组合 View 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49894570/