android - MVVM:从内部片段更新 viewpager2 的容器视图
问题描述
我遇到了麻烦:DI 开始使用 mvvm 和 LiveData,我想以更好的方式做到这一点。我将尝试通过一个简单的示例向您解释我的疑问:
我有一个包含 ViewPager2 的容器片段“Exams”,其中包含一些片段“Question”。还有 ExamsViewModel 和 QuestionViewModel。没有 db,我唯一的数据源是 MyExamDataSource,如下所示:
class MyExamDataSource {
val questions:ArrayList<Question> = ArrayList()
fun saveQuestionResult(){
...
}
fun getQuestion():Question{
...
}
...
...
}
data class Question(val correct:Boolean, val selectedAnswers:ArrayList<Int>)
class ExamViewModel(myExamsDataSource: MyExamsDataSource): ViewModel() {
val correctAnswer:LiveData<Int> = MutableLiveData<Int>(0)
...
...
}
每个 QuestionViewModel 都会验证他自己的问题,但与此同时,每次有新的正确答案时,正确答案 LiveData 都应该增加。MyExamData 源通过模型工厂传递给 ExamsViewModel 和 QuestionViewModel。
但现在我有一些疑问:
- 如何更新正确答案 LiveData ?
- 如果我在 LiveData> 中转换问题字段,并且 ExamsModelView 观察它,如果我只编辑列表的一个元素或者我错了,则不会调用 onChanged 方法?
- 更好地在 modelview 之间进行直接通信?
解决方案
如何更新正确答案 LiveData ?
使用对考试片段的回调。然后考试片段将更新 ViewModel 中的正确答案
如果我在 LiveData> 中转换问题字段,并且 ExamsModelView 观察它,如果我只编辑列表的一个元素或者我错了,则不会调用 onChanged 方法?
如果将元素添加到列表中,它不会调用观察者。有解决方法。请参阅将项目添加到 LiveData 列表时通知观察者
更好地在 modelview 之间进行直接通信?
ModelViews 保存一个或多个视图的数据。因此,他们不应该相互交流。它违背了 MVVM 架构。如果您处于这样的位置,请考虑将一个 ModelView 用于多个视图。这通常通过创建一个带有活动的 ModelView 来实践,该活动也包含该活动中所有片段的数据。
推荐阅读
- php - 有什么方法可以为 wordpress 中的自定义数据库表创建自定义 REST API
- sql - 在 MicroStrategy 中滚动 12 个月的 Salesforce
- angularjs - 为什么我在尝试访问公共 API 时会在 CORS 上被阻止?
- numpy - 读写numpy嵌套数组
- python - 从 0 和 1 的字符串创建一组字符串,其中只有两个字符被更改(python)
- python - 使 pandas df 索引连续
- php - password_verify - 密码与哈希不匹配
- typescript - 如何使用我自己的声明文件解决“找不到模块的声明文件”错误?
- java - 如何将精灵的坐标附加到它的中心?LibGDX
- python - AttributeError:模块“django.db.models”没有属性“RichTextField”