在 Android Composabe 函数之间共享视图模型

问题描述 投票:0回答:1

在可组合函数之间共享相同的 viewModel 时是否会出现任何问题?

android kotlin android-jetpack-compose android-viewmodel
1个回答
0
投票

正如评论中已经指出的那样,在不同的可组合项中使用相同的 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 解耦。您只需提供输入数据即可在任何上下文中使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.