在Android Compose中使用Navigation时,我们经常需要使用ViewModel来管理数据。然而,直接在ViewModel的构造函数中调用导航函数是不可取的,因为这会发生循环依赖,可能会导致应用程序崩溃。解决这个问题的方法是,使用createViewModel()函数,在ViewModel中手动调用Navigation。
以下是示例代码:
//定义NavHost,在其中声明ViewModel而不是在构造函数中使用Navigation @Composable fun NavHost(navController: NavHostController, viewModel: MyViewModel) { NavHost(navController = navController, startDestination = "Screen1") { composable("Screen1") { Screen1(viewModel = viewModel) } composable("Screen2") { Screen2(viewModel = viewModel) } } }
@Composable fun Screen1(viewModel: MyViewModel) { val navController = rememberNavController() Column() { Button(onClick = {viewModel.navigateToScreen2(navController)}) { Text("Go to Screen 2") } } }
@Composable fun Screen2(viewModel: MyViewModel) { Column() { Text(text = "Screen 2") } }
//ViewModel
class MyViewModel : ViewModel() {
private val _navigateToScreen2 = MutableStateFlow(false)
val navigateToScreen2: StateFlow
fun navigateToScreen2(navController: NavHostController) {
_navigateToScreen2.value = true
navController.navigate("Screen2")
}
}
//在viewModel中将MutableStateFlow作为LiveData使用的示例代码:
private val _loginSuccess: MutableStateFlow
//将MutableStateFlow转换为LiveData
val loginSuccessAsLiveData: LiveData
override fun onCleared() { super.onCleared() viewModelScope.cancel() }
fun login(username: String, password: String) { viewModelScope.launch { try { _isLoading.value = true userRepository.login(username,