我在学习State hosting在喷气背包中。我创建了两个单独的函数 ContentStateful
和 ContentStateLess
。在我的 ContentStateLess
中有很多 View ,我正在检查一些条件并相应地更改 View 。我猜测 Stateful
compose 中没有条件/业务逻辑。那么在这里执行这种逻辑的正确方法是什么。
ContentStateful
@Composable
fun ContentStateful(
viewModel: PairViewModel = getViewModel()
) {
ContentStateLess(viewModel)
}
ContentStateLess
@Composable
fun ContentStateLess(
viewModel: PairViewModel
) {
Text()
Text()
Image()
if (viewModel.isTrue) {
Image()
// more item here
} else {
Text()
// more item here
}
Image()
}
那么对于ContentStateLess()
中的if - else
逻辑,最好的建议是什么。非常感谢
最佳答案
如果您要构建无状态可组合项,最好不要传递任何类似 ViewModel 的内容。您可以改为传递 bool 参数。当您希望将自定义可组合项移动到另一个屏幕或另一个项目时,您将需要移动 ViewModel。
Google 推荐无状态可组合项的原因是它难以测试,您可以仅使用输入轻松测试可组合项。
您体验到的另一件事是,内部可组合项的状态越多,您为处于您可能未预料到的状态的可组合项创建的曝光度就越高。
当您构建具有一层、两层、三层的简单可组合项时,这可能不是问题,但具有更多状态和层时,状态管理就成为一个严重的问题。而且,如果您以某种方式忘记或错过了可组合项内的某个状态,您最终可能会出现意想不到的行为。因此,为了最大程度地降低风险并使您的可组合项可测试,您的目标应该是在一个地方管理您的状态,并尽可能在一个包含多个状态的状态持有者类中进行管理。
@Composable
fun ContentStateLess(
firstOneTrue: Boolean
) {
Text()
Text()
Image()
if (firstOneTrue) {
Image()
// more item here
} else {
Text()
// more item here
}
Image()
}
关于android - 在 Jetpack Compose 的无状态 Compose 中管理条件逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74699469/