在可组合函数之间共享相同的 viewModel 时是否会出现任何问题?
正如评论中已经指出的那样,在不同的可组合项中使用相同的 ViewModel 实例是可以的。然而我想指出的是一些设计方面。
有时很容易将同一个 ViewModel 实例传递到可组合层次结构中,如下所示:
@Composable
MainComposable(myViewModel: MyViewModel = viewModel()) {
AComposable(myViewModel)
BComposable(myViewModel)
}
@Composable
AComposable(myViewModel: MyViewModel) {
Text(myViewModel.someText)
}
@Composable
BComposable(myViewModel: MyViewModel) {
Button(onClick = { myViewModel.someFunction() }) {
Text("Button")
}
}
这种方法的问题是可测试性和可重用性。为了测试每个可组合项,您必须提供一个模拟的
MyViewModel
实例。此外,您只能将该可组合项与 MyViewModel
一起使用,而不能在其他上下文中使用。最后,您将破坏@Preview
功能,因为您无法将预览与ViewModel参数一起使用。
为了避免这些缺点,你应该只向每个 Composable 传递它实际需要的数据和函数,而不是传递整个 ViewModel:
@Composable
MainComposable(myViewModel: MyViewModel = viewModel()) {
AComposable(myViewModel.someText)
BComposable(myViewModel.someFunction)
}
@Composable
AComposable(someText: String) {
Text(myViewModel.someText)
}
@Composable
BComposable(someFunction: () -> Unit) {
Button(onClick = { someFunction() }) {
Text("Button")
}
}
这样,
AComposable
和 BComposable
现在可以轻松测试并与 ViewModel 解耦。您只需提供输入数据即可在任何上下文中使用它们。