考虑这个例子。
对于身份验证,我们将使用 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
有没有办法在撰写功能中获取当前活动?
@Composable
fun CameraPreviewScreen() {
val context = ContextAmbient.current
if (ActivityCompat.checkSelfPermission(
context,
Manifest.permission.CAMERA
) != PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(
this, MainActivity.REQUIRED_PERMISSIONS, MainActivity.REQUEST_CODE_PERMISSIONS // get activity for `this`
)
return
}
}
Run Code Online (Sandbox Code Playgroud) 我试图在两个地方获取视图模型,其中一个在 MainActivity 中使用:
val viewModel:MyViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)
另一个地方是在 compose 函数内部,使用:
val viewModel:MyViewModel = hiltViewModel()
Run Code Online (Sandbox Code Playgroud)
当我调试时,似乎那是两个不同的对象。无论如何,我可以在两个地方获得相同的对象吗?
android android-viewmodel android-jetpack-compose dagger-hilt
我正在开发一个交易应用程序。我需要列出用户股票及其价值(利润或损失)以及投资组合的总价值。
对于馆藏列表,在 MVP 架构中,我将为每个列表项创建一个演示者,但对于此应用程序,我决定使用 MVVM(Compose、ViewModels 和 Hilt)。我的第一个想法是为每个列表项创建一个不同的 ViewModel。我hiltViewModel()在可组合方法签名中使用来创建 ViewModel 的实例,但这总是给我相同的实例,而这不是我想要的。使用 MVVM 架构时,我正在尝试以正确的方式执行操作还是应该使用单个 ViewModel?您知道我可以看看的任何项目吗?下图是我的实际屏幕的超级简化,每个单元格都很复杂,这就是为什么我想为每个单元格使用不同的 ViewModel。任何建议都非常受欢迎。
android mvvm viewmodel android-architecture-components android-jetpack-compose
android ×3
android-architecture-components ×1
dagger-hilt ×1
koin ×1
kotlin ×1
mvvm ×1
viewmodel ×1