gpt4 book ai didi

android - 添加 Android Jetpack Compose 导航库后,实现 ViewModelProvider.Factory 失败,继承自具有 '@JvmDefault' 的接口(interface)

转载 作者:行者123 更新时间:2023-12-05 00:17:47 27 4
gpt4 key购买 nike

我有这个简单的 View 模型提供程序工厂代码(从 Google 的一个代码示例中借用),它很乐意执行并完美编译...

fun <VM : ViewModel> viewModelProviderFactoryOf(
create: () -> VM
): ViewModelProvider.Factory = SimpleFactory(create)


private class SimpleFactory<VM : ViewModel>(
private val create: () -> VM
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val vm = create()
if (modelClass.isInstance(vm)) {
@Suppress("UNCHECKED_CAST")
return vm as T
}
throw IllegalArgumentException("Can not create ViewModel for class: $modelClass")
}
}

...直到我介绍了这个库:

implementation "androidx.navigation:navigation-compose:2.5.0-rc02"

现在突然编译失败了:

仅允许使用 -Xjvm-default 选项从具有“@JvmDefault”成员的接口(interface)继承

(指向 的错误:ViewModelProvider.Factory)

为什么?导航带来了什么? (我确实 100% 确认是导航库导致的,删除它,错误就消失了)

注意:Q 不是关于如何解决它的,编译器会清楚地建议它,添加这些参数 - freeCompilerArgs += "-Xjvm-default=all"。 Q 是关于为什么会发生这种情况。

最佳答案

好的,找到了。问题是引入组合导航,版本 2.5.0-rc 还将 androidx.lifecycle 更新为 2.5.0-rc(在我的例子中,从 2.3.0),并且在那里,他们改变了 Factory 接口(interface) 通过添加带有实现的方法(以及向接口(interface)中的现有方法添加实现)。

比较:

2.5.0之前的工厂实现:

public interface Factory {
/**
* Creates a new instance of the given {@code Class}.
* <p>
*
* @param modelClass a {@code Class} whose instance is requested
* @param <T> The type parameter for the ViewModel.
* @return a newly created ViewModel
*/
@NonNull
<T extends ViewModel> T create(@NonNull Class<T> modelClass);
}

注意一种方法,创建没有实现。

这是他们在 2.5.0 中所做的重写

public interface Factory {
/**
* Creates a new instance of the given `Class`.
*
* Default implementation throws [UnsupportedOperationException].
*
* @param modelClass a `Class` whose instance is requested
* @return a newly created ViewModel
*/
public fun <T : ViewModel> create(modelClass: Class<T>): T {
throw UnsupportedOperationException(
"Factory.create(String) is unsupported. This Factory requires " +
"`CreationExtras` to be passed into `create` method."
)
}

/**
* Creates a new instance of the given `Class`.
*
* @param modelClass a `Class` whose instance is requested
* @param extras an additional information for this creation request
* @return a newly created ViewModel
*/
public fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T =
create(modelClass)


...
}

所以这就解释了,这个接口(interface)现在是一个默认实现接口(interface),要继承它,需要添加编译器参数,正如编译器所建议的那样(freeCompilerArgs += "-Xjvm-默认=全部”)。

关于android - 添加 Android Jetpack Compose 导航库后,实现 ViewModelProvider.Factory 失败,继承自具有 '@JvmDefault' 的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72733193/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com