如何在Composable中初始化带参数的Koin ViewModel
你的Koin模块定义本身符合规范,前两个参数会通过get()自动注入你已注册的两个Repository单例实例,后三个为运行时动态传递的参数,在Compose中使用时按以下步骤操作即可:
- 首先确认Application中已加载全部Koin模块,避免出现依赖找不到的异常
class MyApp : Application() { override fun onCreate() { super.onCreate() startKoin { androidContext(this@MyApp) // 按顺序注册所有依赖模块 modules(firstRepositoryModule, secondRepositoryModule, viewModelModule) } } }
- 在Composable函数中获取ViewModel实例时,通过
parametersOf传递三个动态参数即可
@Composable fun MyScreen( id: Int, userName: String, email: String ) { // 传入运行时参数获取ViewModel实例 val viewModel: MyViewModel = viewModel( parameters = { parametersOf(id, userName, email) } ) // 后续直接使用viewModel执行业务逻辑 }
补充说明
如果是Navigation Compose场景,参数来自导航路由传参,只需要先从导航返回栈取出对应参数再传入即可,示例:
composable("user_detail/{id}/{userName}/{email}") { backStackEntry -> val id = backStackEntry.arguments?.getInt("id") ?: 0 val userName = backStackEntry.arguments?.getString("userName").orEmpty() val email = backStackEntry.arguments?.getString("email").orEmpty() val viewModel: MyViewModel = viewModel( parameters = { parametersOf(id, userName, email) } ) UserDetailScreen(viewModel) }
注意需保证parametersOf中传入的参数顺序、类型和你在viewModel模块定义的lambda参数完全一致,否则会出现参数不匹配的注入异常。
内容的提问来源于stack exchange,提问作者crossdeath
相关产品推荐
相关产品推荐

