Proguard,无法创建ViewModel类的实例kotlin

问题描述 投票:1回答:2

我只是在minifyEnabled为true时才会收到错误(即使使用-dontobfuscate)

java.lang.RuntimeException: Cannot create an instance of class com.myapps.app.TracksVM
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:202)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103)
        at com.myapps.app.MyFragment.onCreateView(MyFragment.kt:72)

支持库源中的ViewModelProvider.java:202指的是:

try {
                    return modelClass.getConstructor(Application.class).newInstance(mApplication);
                } catch (NoSuchMethodException e) {
                    throw new RuntimeException("Cannot create an instance of " + modelClass, e);
                }

Proguard可能删除了一个方法或构造函数?

这是我的proguard.pro:

-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn javax.annotation.**
-dontwarn org.conscrypt.**
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
-dontobfuscate

ViewModel:

class TracksVM(application: Application) : AndroidViewModel(application) {
...
}

碎片:

class MyFragment : Fragment() {
    private lateinit var viewModel: TracksVM

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        return inflater.inflate(R.layout.content_recents, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        viewModel = ViewModelProviders.of(this).get(TracksVM::class.java)
    }
}
android android-lifecycle android-proguard
2个回答
2
投票

你没有传递viewModelProvider工厂 -

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    viewModel = ViewModelProviders.of(this,viewModelProvidersFactory).get(TracksVM::class.java)
}

我希望这能帮到您。


0
投票

android生命周期aar的消费者Proguard规则中缺少以下规则:

-keepclassmembers,allowshrinking,allowobfuscation class * extends android.arch.lifecycle.AndroidViewModel {
    <init>(android.app.Application);
}

当使用最新版本(androidx?)时,它应该是afaik修复。

© www.soinside.com 2019 - 2024. All rights reserved.