无法初始化视图模型匕首+扩展功能
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 的互操作性问题,我怀疑除了改变您的实现方式之外还有其他解决方案。
我正在尝试创建一个扩展函数,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 的互操作性问题,我怀疑除了改变您的实现方式之外还有其他解决方案。