ComposeUI中的ViewModel注入方式
viewModel()
viewModel()函数用于创建和持有ViewModel实例。
- Name
特点
- Type
- features
- Description
- 由Composable持有和管理生命周期
- 重组时保持状态
- 适用于Composable创建的VM
- 通常在父Composable中声明
- Name
使用场景
- Type
- usage
- Description
- Composable自己创建VM
- VM需要在Composable生命周期内保持
- 不需要共享VM实例
viewModel()示例
class UserViewModel : ViewModel() {
var name by mutableStateOf("")
private set
fun updateName(newName: String) {
name = newName
}
}
@Composable
fun UserScreen() {
val viewModel = viewModel<UserViewModel>()
TextField(
value = viewModel.name,
onValueChange = { viewModel.updateName(it) }
)
}
参数传递
通过参数显式传递ViewModel实例。
- Name
特点
- Type
- features
- Description
- 不创建VM实例
- 依赖外部传入
- 适用于子Composable
- 显式依赖关系
- Name
使用场景
- Type
- usage
- Description
- 从父Composable传递VM
- VM需要在多个Composable共享
- 子Composable使用父Composable的VM
参数传递示例
@Composable
fun ProfileScreen(viewModel: UserViewModel) {
Column {
Text("Name: ${viewModel.name}")
Button(onClick = { viewModel.updateName("") }) {
Text("Reset")
}
}
}
@Composable
fun ParentScreen() {
val userViewModel = viewModel<UserViewModel>()
ProfileScreen(viewModel = userViewModel)
}
hiltViewModel()
使用Hilt进行依赖注入管理ViewModel实例。
- Name
特点
- Type
- features
- Description
- 依赖注入管理
- 支持作用域管理
- 适用于复杂依赖
- 便于测试
- Name
使用场景
- Type
- usage
- Description
- 需要依赖注入
- VM有复杂依赖关系
- 需要管理作用域
hiltViewModel()示例
@HiltViewModel
class AppViewModel @Inject constructor(
private val repository: UserRepository
) : ViewModel() {
var isLoggedIn by mutableStateOf(false)
private set
}
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
AppContent()
}
}
}
@Composable
fun AppContent() {
val viewModel = hiltViewModel<AppViewModel>()
if (viewModel.isLoggedIn) {
HomeScreen()
} else {
LoginScreen()
}
}