无法初始化视图模型匕首+扩展功能

Can't initialize viewmodel Dagger + Extension Function

我正在尝试创建一个扩展函数,return 一个 viewmodel by lazy,但是当我在同一个 Fragment 中使用 by lazy 工作正常时,我收到一个关于 viewmodelFactory 未初始化的错误,

示例(工作正常):

    @Inject
    lateinit var viewModelFactory: ViewModelProvider.Factory
    private val listViewModel by lazy {
        ViewModelProvider(this, viewModelFactory)[ListViewModel::class]
    }

但是当我将它提取到扩展函数时失败了

示例(错误):

inline fun <reified VM : ViewModel> Fragment.provideViewModel(
    viewModelFactory: ViewModelProvider.Factory
): Lazy<VM> = lazy {
    ViewModelProvider(this, viewModelFactory)[VM::class.java]
}
    @Inject
    lateinit var viewModelFactory: ViewModelProvider.Factory
    private val listViewModel by provideViewModel<ListViewModel>(viewModelFactory)

看看幕后发生的事情,似乎内联函数是原因。当您将 Kotlin 代码反编译为 Java 时,您会看到 Kotlin 使用特殊包装器 class 处理内联函数,不幸的是,该包装器将函数参数作为构造函数参数:

this.viewModel$delegate = LazyKt.lazy((Function0)(new ActivityMain$$special$$inlined$provideViewModel(this, viewModelFactory$iv)));

所以它需要 viewModelFactory$iv 代表要初始化的 lateinit 工厂:

Factory var10001 = this.fac;
if (var10001 == null) {
    Intrinsics.throwUninitializedPropertyAccessException("fac");
}
androidx.lifecycle.ViewModelProvider.Factory viewModelFactory$iv = (androidx.lifecycle.ViewModelProvider.Factory)var10001;

所以这显然是 Kotlin 和 Dagger 的互操作性问题,我怀疑除了改变您的实现方式之外还有其他解决方案。