考虑这个例子。
对于身份验证,我们将使用 2 个屏幕 - 一个屏幕用于输入电话号码,另一个屏幕用于输入 OTP。
这两个屏幕都是用 Jetpack Compose 制作的,对于 NavGraph,我们使用组合导航。
另外我必须提到 DI 是由 Koin 处理的。
val navController = rememberNavController()
NavHost(navController) {
navigation(
startDestination = "phone_number_screen",
route = "auth"
) {
composable(route = "phone_number_screen") {
// Get's a new instance of AuthViewModel
PhoneNumberScreen(viewModel = getViewModel<AuthViewModel>())
}
composable(route = "otp_screen") {
// Get's a new instance of AuthViewModel
OTPScreen(viewModel = getViewModel<AuthViewModel>())
}
}
}
Run Code Online (Sandbox Code Playgroud)
那么,我们如何在 Jetpack 组合 NavGraph 中的两个或多个可组合项之间共享相同的视图模型呢?
kotlin koin android-jetpack-compose jetpack-compose-navigation
我有一个活动应用程序,仅使用 ui 的可组合项(一个活动,没有片段)。我使用一个视图模型在两个不同的屏幕(可组合项)中保存 ui 的数据。我按照状态文档中的描述在两个屏幕中创建视图模型
@Composable
fun HelloScreen(helloViewModel: HelloViewModel = viewModel())
Run Code Online (Sandbox Code Playgroud)
现在我注意到在第一个屏幕中加载或设置的数据在第二个屏幕中被重置。
我还注意到init{}每次被调用时viewModel()都会被调用。这真的是预期的行为吗?
根据该方法的文档,它应该返回现有的 ViewModel 或创建一个新的 ViewModel。
我还看到视图模型是不同的对象。所以viewModel()总是创建一个新的。但为什么?
有什么想法我可能做错了什么吗?或者我误解了该方法的用法?
使用 Compose,可以通过以下方式实现“每个屏幕状态”:
NavHost(navController, startDestination = startRoute) {
...
composable(route) {
...
val perScreenViewModel = viewModel() // This will be different from
}
composable(route) {
...
val perScreenViewModel = viewModel() // this instance
}
...
}
Run Code Online (Sandbox Code Playgroud)
“应用程序状态”可以通过以下方式实现:
val appStateViewModel = viewModel()
NavHost(navController, startDestination = startRoute) {
...
}
Run Code Online (Sandbox Code Playgroud)
但是对于“Scoped State”呢?我们如何在 Compose 中实现它?
android android-navigation android-viewmodel android-jetpack-compose
在片段中,我们有
private val activityViewModel: MainActivityViewModel by activityViewModels()
private val fragmentViewModel: MainFragmentViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)
获取整个应用程序中的共享视图模型(活动视图模型)和视图特定视图模型(片段视图模型)的实例。
我正在迁移以作曲。
如何在jetpack compose中获得两个具有不同范围的视图模型?
从文档中,我可以看到这一行,
viewModel() 返回一个现有的 ViewModel 或在给定范围内创建一个新的 ViewModel。
但是,如何指定视图模型的范围?
PS
我已经解决了这个类似的问题,但没有任何答案。
我需要询问联系人的权限,当应用程序启动时,我要问,在ViewModel部分,我需要调用需要权限的方法。我需要检查权限是否由用户授予,然后再调用,但是要检查权限,我需要具有访问活动。而在我的ViewModel中,我没有对Activity的引用,也不想拥有,如何解决该问题?