最近我在做一个小项目,想到了一件事关于 compose 和 dagger。
通常我使用带有注入功能的 Dagger,这对我来说是一切,但现在看来它不起作用,因为我们没有任何“对象”可以注入。所以我的问题是现在如何注射?我仍然可以像以前一样创建组件,但似乎我需要自己提供属性或创建一些 @Composable 函数来为我做这件事。
所以我的问题是现在如何使用 DI(尤其是 Dagger)和 Compose?
我正在寻找一些文章,但大多数都是关于刀柄的,我想使用纯匕首。
总而言之,我最终得到了这个我已经使用了一段时间的解决方案:
class DaggerViewModelProvider {
companion object {
@Composable
@Suppress("unchecked_cast")
inline fun <reified VM : ViewModel> daggerViewModel(
key: String? = null,
crossinline viewModelInstanceCreator: @DisallowComposableCalls () -> VM
): VM {
val factory = remember(key) {
object : ViewModelProvider.Factory {
override fun <VM : ViewModel> create(modelClass: Class<VM>): VM {
return viewModelInstanceCreator() as VM
}
}
}
return viewModel(key = key, factory = factory)
}
}
}
并从我需要的任何地方调用它,如下所示:
val viewModel = DaggerViewModelProvider.daggerViewModel {
authComponent.authViewModel
}