一般来说,我知道在每个屏幕上定义多个视图模型是一种糟糕的做法.然而,对于特殊的用例,我发现它很有用.

例如,让我们考虑一个显示网络状态的StatusBar Composable.通过Hilt注入将ViewModel封装在Composable中,使其在每个屏幕上都可以重用,而不会用网络状态相关的东西"污染"屏幕ViewModel.

然而,这会 destruct 屏幕预览,因为Android Studio中的预览不能与ViewModel一起使用.

那么,这是一种糟糕的做法吗?使用该Composable重写每个屏幕的每个视图模型中的逻辑会更好吗?

请考虑以下代码作为我所指的示例.

// ViewModel.kt
@HiltViewModel
class OfflineStatusBarViewModel @Inject constructor(
    networkState: NetworkState,
) : ViewModel() {
    val isOffline = networkState.isAvailable
        .map { !it }
        .stateIn(viewModelScope, WhileUiSubscribed, false)
    
}
// StatusBar.kt
@Composable
fun OfflineStatusBar(
    modifier: Modifier = Modifier,
    viewModel: OfflineStatusBarViewModel = hiltViewModel()
) {
    val isVisible by viewModel.isOffline.collectAsState()
    if (isVisible) {
        OfflineIndicator(modifier = modifier)
    }
}

推荐答案

通常被认为是bad practicedefine a ViewModel for every child composable even with hilt.ViewModel通常负责管理UI相关的状态和业务逻辑.
子组合应该关注显示UI元素,而不是管理状态或业务逻辑.
better approach is将必要的data and callbacks从父组合传递到子组合.这可以对子组合物进行using state hoisting or by passing the data and callbacks as parameters.这将使可组合more reusable and testable,它也将有助于improve performance.
因此, for each 可组合对象提供ViewModel会使代码库更加复杂和难以维护.它还可能导致逻辑和数据的重复,因为不同的ViewModel最终可能会管理类似的信息.
如果为you don't config the Hilt correctly,则每次重新组合组合对象时都会重新创建它.这可能是cause performance issues,特别是如果ViewModel正在做很多工作.

这是一篇由谷歌 compose 的关于100的精彩文章,一定要读一读.

Android相关问答推荐

当我的Log.i()不在主线程中时,如何在我的logcat中显示它?

Jetpack Compose:如何将浮动操作按钮上方的子按钮居中对齐?

关闭导致Kotlin中的内存泄漏?

安卓喷气背包组成倒计时动画

Android 11:在try 获取文件的永久权限后,仍然没有读写权限

将DiffUtils用于Android上的Recrecerview适配器

我无法在底部导航栏中正确导航-Android底部导航视图

错误:参数的类型必须是用@Entity注释的类或其集合/array. java.lang.String tocd);

任务:app:kaptGenerateStubsDebugKotlin执行失败. > 'compileDebugJavaWithJavac' 任务(当前目标是 1.8)

如何仅同步 local_manifest.xml?

Compose 状态不是 recomposing

如何知道我的应用程序的新版本是否显示广告?

在 react native 中设置 react-native-paper 组件的样式

Jetpack Compose 重组竞争条件

重命名列失败的房间自动迁移(NOT NULL 约束失败,生成错误的迁移类)

从expose 的 dropdownMenu 可组合、jetpack 组合中 Select 选项时,不会触发文本字段的 onValueChange

如何从我的 android 应用程序中删除 QUERY_ALL_PACKAGES 权限?

如何在 Compose 中更改高程 colored颜色 ?

Android Studio:如何添加应用程序质量洞察窗口以查看 Android Studio 中的 Crashlytics 数据?

Android - 水平(从右到左)圆形背景 colored颜色 过渡