繁体   English   中英

如何使用可组合项中的参数初始化 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)
    }
}

所以 viewmodel 总共接受五个参数,前两个是存储库,这里是它们两个的模块:

val firstRepositoryModule = module {
    single {
        FirstRepository()
    }
}
val secondRepositoryModule = module {
    single {
       SecondRepository()
    }
}

我知道这个示例代码,但这里的视图模型不接受任何参数,所以它没有回答我的问题

正如Koin 的文档中提到的,我们可以通过 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) }
                    )

我通过在可组合的构造函数中初始化视图模型解决了这个问题:

@Composable
fun ComposableFunction(
    id: Int, user: String, email: String,
    viewModel: MyViewModel = MyViewModel(get(), get(), id, user, email)
){
    ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM