在Android Jetpack Compose中,为子Composable定义ViewModel是否为不良实践?
在Composable中嵌入专属ViewModel是否属于不良实践?
通常大家都认为一个屏幕对应多个ViewModel是不良实践,但在某些特殊场景下,我发现这种方式很实用。比如一个显示网络状态的StatusBar Composable:通过Hilt将ViewModel封装在Composable内部,既可以让这个组件在各个屏幕复用,又不会让屏幕的ViewModel被网络状态相关逻辑污染。但问题是,这种做法会导致Android Studio的预览功能失效——因为预览不支持ViewModel。
我现在的疑问是:这种做法到底算不算不良实践?还是说应该在每个使用该Composable的屏幕ViewModel中重复编写相关逻辑?
代码示例
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) } }
内容的提问来源于stack exchange,提问作者Mirco Bellagamba
相关产品推荐
相关产品推荐

