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()
    }
}

这篇文章对你有用吗?