我目前正在学习 Android ViewModel,但我不完全确定使用它们的正确方法。
据我所知,ViewModel 旨在将逻辑与视图隔离。因此,我将逻辑分离到 ViewModel 中,并将其连接到使用 LiveData 实时更新的视图。 在我的项目中,我使用 ViewModel 来管理 PIN,这涉及验证它并将其发送到父组件。为此,我实现了两种视图:一种用于手动输入 PIN,另一种用于使用 QR 码扫描 PIN。
我的目标是在父视图的选项卡布局中显示两种输入法。
这是我想要实现的简化代码。我目前不确定将 ViewModel 绑定到视图的正确方法,并且在网上找不到合适的参考。我有一个特别的问题是我是否应该创建 ViewModel 的两个单独的实例。我担心的是,我不希望 view1 中采取的操作影响 view2,反之亦然。
class ParentFragment: Fragment(){
private lateinit var child1ViewModel: AbstractViewModel
private lateinit var child2ViewModel: AbstractViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Initialisez les ViewModels avec les données initiales si nécessaire.
child1ViewModel = ViewModelProvider(this).get(AbstractViewModel::class.java)
child2ViewModel = ViewModelProvider(this).get(AbstractViewModel::class.java)
val child1Fragment = Child1Fragment.newInstance(child1ViewModel)
val child2Fragment = Child2Fragment.newInstance(child2ViewModel)
childFragmentManager.beginTransaction()
.replace(
R.id.fragment_container_1,
child1Fragment,
Child1Fragment::class.java.simpleName
)
.replace(
R.id.fragment_container_2,
child2Fragment,
Child2Fragment::class.java.simpleName
)
.commit()
}
}
任何见解或指导将不胜感激。 提前谢谢你:)
编辑:我刚刚发现这篇文章:与多个片段共享一个视图模型
建议1个视图保留1个视图模型。还建议:
如果您有通用代码,则可以拥有多个从包含共享代码的 baseViewModel 继承的 viewModel。
你的意见是什么?
如果需要,您可以在不同视图之间共享相同的 ViewModel。
我强烈鼓励您在项目中实现 Hilt 来处理 ViewModel 实例。
您只需使用
Application
注释您的 @HiltAndroidApp
类,然后使用 @AndroidEntryPoint
注释您的视图,并使用 @HiltViewModel
注释您的 ViewModel,如文档中所示。
然后你可以使用以下方法获取 ViewModel 实例:
private val viewModel: YourViewModel by viewModels()