一般来说,我知道在每个屏幕上定义多个视图模型是一种糟糕的做法.然而,对于特殊的用例,我发现它很有用.
例如,让我们考虑一个显示网络状态的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)
}
}