我正在学习喷气背包作曲State hosting.我已经创建了两个独立的函数ContentStatefulContentStateLess.在我的ContentStateLess中,它们里面有很多视图,我正在判断一些情况,并相应地更改视图.我猜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的内容.您可以改为传递布尔参数.当您希望将自定义Composable移动到另一个屏幕或另一个项目时,您也需要移动ViewModel.

谷歌推荐无状态Composable的原因是它很难测试,你可以很容易地测试一个只有输入的Composable.

你体验的另一件事是,内在可组合的状态越多,你为你的可组合的存在在一个你可能没有预料到的状态中创造的expose 就越多.

当您使用一个、两个或三个层构建简单的可组合组件时,可能不是问题,但是如果有更多的状态和层,状态管理就会成为一个严重的问题.如果您以某种方式忘记或错过了Composable中的某个状态,则可能会出现意外的行为.因此,为了最小化风险并使您的可组合组件可测试,您应该致力于在一个地方管理您的状态,并且可以在包装多个状态的状态保持器类中进行管理.

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

Android相关问答推荐

如何在Android Emulator上从物理设备接收TCP消息

如何在Android中使用TextView设置动态文本的样式

Android开发:主题排版不适用于按钮文本

Android:微调:在代码中设置ArrayAdapter不希望调用On ItemSelected,仅当用户单击微调时调用

如何使可拖动内容停留在可组合框的边界内

如何在Jetpack Compose中更新异步回调的用户界面

如何使用 Wea​​r OS 上的运行状况服务模拟位置?

通过 setIntentScanningStrategyEnabled(true) 未检测到信标的 Android Beacon 库后台扫描

Android Studio电鳗:javaHome好像无效

使用 Dagger Hilt 获取接口的所有实例

compose 导航参数字符串包含花括号?

在 Jetpack Compose 中使用 ViewModel 实现 startActivity 的最佳实践

在 Jetpack Compose 中使用 .observeAsState() 时,如何在更改 MutableLiveData 的值后开始执行一段代码?

在事件中使用 Context/Toast 时不需要的重组 - Jetpack Compose

如何使用 Jetpack Compose 在图像上叠加文本

Jetpack 组合千位分隔符视觉转换,也适用于小数

如何只允许拖动 BottomSheetScaffold 中 BottomContent 的 SheetPeek 的一部分?

Android:appcompat 和 material 如何从默认创建 appcompat 和 material 视图?

Hilt 依赖注入重复绑定错误

在 Android 10 (API 29) 中隐藏状态栏并在应用程序中使用其空间