android 在jetpack合成中管理无状态合成中的条件逻辑

quhf5bfb  于 2022-12-09  发布在  Android
关注(0)|答案(1)|浏览(156)

我正在学习jetpack compose中的状态托管。我创建了两个独立的函数ContentStatefulContentStateLess。在我的ContentStateLess中,它们内部有很多视图,我正在检查一些条件并相应地更改视图。我猜测Stateful compose内部没有条件/业务逻辑。那么,在这里执行这种逻辑的正确方法是什么呢?

内容状态

@Composable
fun ContentStateful(
    viewModel: PairViewModel = getViewModel()
) {
    ContentStateLess(viewModel)
}

无内容状态

@Composable
fun ContentStateLess(
    viewModel: PairViewModel
) {
    Text()
    Text()
    Image()
    if (viewModel.isTrue) {
         Image()
         // more item here
    } else {
          Text()
         // more item here
    }
    Image()
}

那么,对于ContentStateLess()中的if - else逻辑,最好的建议是什么呢?

hgb9j2n6

hgb9j2n61#

如果要生成无状态可组合对象,最好不要传递ViewModel之类任何内容您可以改为传递布尔参数如果要将自定义可组合对象移动到另一个屏幕或另一个项目,则需要移动ViewModel
Google推荐无状态Composable的原因是它很难测试,你可以很容易地只使用输入来测试Composable。
另一件事你经历的状态越多,内在的可组合体就越多,你为你的可组合体创造的曝光就越多,你可能没有预料到。
当您使用一个、两个三个层可能不是问题,但如果有更多的状态和层,状态管理就成了一个严重的问题。如果您不知何故忘记或错过了Composable中的一个状态,您可能会以一个不期望的行为结束。因此,为了最大限度地降低风险并使您的Composables可测试,您应该将目标放在一个地方管理您的状态,并可能放在一个状态保持器类中,该类 Package 多个状态。

@Composable
fun ContentStateLess(
    firstOneTrue: Boolean
) {
    Text()
    Text()
    Image()
    if (firstOneTrue) {
         Image()
         // more item here
    } else {
          Text()
         // more item here
    }
    Image()
}

相关问题