android - 在 Jetpack Compose 的无状态 Compose 中管理条件逻辑

标签 android kotlin android-jetpack-compose

我在学习State hosting在喷气背包中。我创建了两个单独的函数 ContentStatefulContentStateLess。在我的 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/

相关文章:

java - Gradle:如何将 kotlin 和 java 保存在同一个源文件夹中?

java - 负载测试异步任务

Android操作栏不显示溢出

java - 无论屏幕方向如何,如何获得正确的方位(磁性方向)?

java - Android:Webview加载URL失败?

Kotlin 类型、子类型和父类(super class)型与类、子类和父类(super class)

java - 如何将改造回调响应中的回调从 java 转换为 Kotlin

android - 如何在 Android Compose 中动态更新 AndroidView 内的 RecyclerView

android - java.lang.NoSuchFieldError : No field $stable of type I in class

android - 喷气背包撰写 java.lang.IllegalStateException : Start/end imbalance