通用ViewModel
使用Compose Multiplatform可以在通用代码中实现Android的ViewModel构建UI方案。
在项目中添加通用ViewModel
要使用跨平台ViewModel
实现,请向commonMain
源集添加以下依赖:
kotlin {
// ...
sourceSets {
// ...
commonMain.dependencies {
// ...
implementation("org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose:2.8.2")
}
// ...
}
}
在通用代码中使用ViewModel
Compose Multiplatform实现了通用的ViewModelStoreOwner
接口,因此在通用代码中使用ViewModel
类与Android最佳实践差异不大。
以导航示例为例:
声明ViewModel类:
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewmodel.compose.viewModel
class OrderViewModel : ViewModel() {
private val _uiState = MutableStateFlow(OrderUiState(pickupOptions = pickupOptions()))
val uiState: StateFlow<OrderUiState> = _uiState.asStateFlow()
// ...
}
将ViewModel添加到可组合函数中:
@Composable
fun CupcakeApp(
viewModel: OrderViewModel = viewModel { OrderViewModel() },
) {
// ...
}
在非JVM平台上,无法通过类型反射实例化对象。因此在通用代码中调用viewModel()
函数时必须提供初始化器参数:每次创建ViewModel
实例时至少需要传入一个初始化器。
如果仅提供初始化器,库会在底层创建默认工厂。但您也可以实现自定义工厂,并调用更显式版本的通用viewModel(...)
函数, 这与Jetpack Compose中的用法一致。
22 四月 2025