如何使用可组合项中的参数初始化 Koin 视图模型?
How to initialize Koin viewmodel with parameters inside a composable?
我的视图模型模块如下所示:
val viewModelModule = module {
viewModel { (id: Int, user: String, email: String) ->
MyViewModel(get(), get(), id = id, user = user, email = email)
}
}
所以视图模型一共接受五个参数,前两个是存储库,这里是它们的模块:
val firstRepositoryModule = module {
single {
FirstRepository()
}
}
val secondRepositoryModule = module {
single {
SecondRepository()
}
}
我知道 this sample code,但是这里的视图模型不接受任何参数,所以它没有回答我的问题
我通过在可组合项的构造函数中初始化视图模型解决了这个问题:
@Composable
fun ComposableFunction(
id: Int, user: String, email: String,
viewModel: MyViewModel = MyViewModel(get(), get(), id, user, email)
){
...
}
如 Koin's docs 中所述,我们可以通过 parametersOf() 函数将参数传递给 ViewModel,我们可以使用 getViewModel(parametersOf(...)).
组合获取 ViewModel
带有两个参数的 ViewModel 示例,带有对象 ID 和存储库的字符串。在 init{} 中我们可以同时使用它们:
class MeaningViewModel(private val meaningID: String, private val dictRepository: DictRepository) : ViewModel() {
init {
viewModelScope.launch {
val reply = dictRepository.getMeaningDetails(meaningID)
...
}
Koin 模块,存储库作为单例,ViewModel 有两个参数:
val appModule = module {
single<DictRepository> { DictRepositoryImpl() }
viewModel { MeaningViewModel(get(), get()) }
...
}
在 NavHost 的可组合项中:
composable(
route = "meaning/{meaningID}",
arguments = listOf(navArgument("meaningID") { type = NavType.StringType })
) { entry ->
val meaningID = entry.arguments?.getString("meaningID") ?: ""
val viewModel = getViewModel<MeaningViewModel>(
parameters = { parametersOf(meaningID) }
)
我的视图模型模块如下所示:
val viewModelModule = module {
viewModel { (id: Int, user: String, email: String) ->
MyViewModel(get(), get(), id = id, user = user, email = email)
}
}
所以视图模型一共接受五个参数,前两个是存储库,这里是它们的模块:
val firstRepositoryModule = module {
single {
FirstRepository()
}
}
val secondRepositoryModule = module {
single {
SecondRepository()
}
}
我知道 this sample code,但是这里的视图模型不接受任何参数,所以它没有回答我的问题
我通过在可组合项的构造函数中初始化视图模型解决了这个问题:
@Composable
fun ComposableFunction(
id: Int, user: String, email: String,
viewModel: MyViewModel = MyViewModel(get(), get(), id, user, email)
){
...
}
如 Koin's docs 中所述,我们可以通过 parametersOf() 函数将参数传递给 ViewModel,我们可以使用 getViewModel(parametersOf(...)).
组合获取 ViewModel带有两个参数的 ViewModel 示例,带有对象 ID 和存储库的字符串。在 init{} 中我们可以同时使用它们:
class MeaningViewModel(private val meaningID: String, private val dictRepository: DictRepository) : ViewModel() {
init {
viewModelScope.launch {
val reply = dictRepository.getMeaningDetails(meaningID)
...
}
Koin 模块,存储库作为单例,ViewModel 有两个参数:
val appModule = module {
single<DictRepository> { DictRepositoryImpl() }
viewModel { MeaningViewModel(get(), get()) }
...
}
在 NavHost 的可组合项中:
composable(
route = "meaning/{meaningID}",
arguments = listOf(navArgument("meaningID") { type = NavType.StringType })
) { entry ->
val meaningID = entry.arguments?.getString("meaningID") ?: ""
val viewModel = getViewModel<MeaningViewModel>(
parameters = { parametersOf(meaningID) }
)