使用空构造函数构造的 SavedStateViewModelFactory

SavedStateViewModelFactory constructed with empty constructor

navigation 组件和 lifecycle viewmodel 版本更新到 2.5.0-alpha01 后,我遇到了以下问题。

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.atcc.aewp/com.atcc.aewp.activity.SplashActivity}: java.lang.UnsupportedOperationException: SavedStateViewModelFactory constructed with empty constructor supports only calls to create(modelClass: Class, extras: CreationExtras).

加载视图模型时抛出异常

open class BaseActivity : AppCompatActivity() {

    private val appLanguageViewModel: AppLanguageViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        appLanguageViewModel.result.observe(this) {
            ...
        }
    }
}

这是我的视图模型class

class AppLanguageViewModel : ViewModel() {

    private val languageLiveData = MutableLiveData<Event<ApplicationLanguage>>()

    val result: LiveData<Event<ApplicationLanguage>> = languageLiveData

    fun setLanguage(applicationLanguage: ApplicationLanguage) {
        if (LanguagePreferences.instance().setLanguage(applicationLanguage.name)) {
            languageLiveData.postValue(Event(applicationLanguage))
        }
    }
}

解决方法;

    private val viewModel: AppLanguageViewModel by viewModels {
      SavedStateViewModelFactory(application, this)
    }

原因;

因为并非所有东西都使用 ViewModelFactory 的新 API,所以我们遇到了这个崩溃。 ComponentActivity 中的默认工厂是 SavedStateViewModelFactory,没有任何构造函数参数。

我们遇到 HiltViewModelFactory 问题。它调用创建方法而不传递新的 CreationExtras 值。我认为这应该在我们的案例中得到解决。如果您可以分享堆栈跟踪的其余部分,我们也可能会找出您的情况的根本原因。

在我们的案例中,Sinan Kozak 的变通办法没有奏效。 我们目前面临的问题是因为我们使用了以下版本的导航和生命周期

生命周期

implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.1'

导航

implementation 'androidx.navigation:navigation-fragment-ktx:2.5.0-alpha01'
implementation 'androidx.navigation:navigation-ui-ktx:2.5.0-alpha01'

这导致 phone 上的生物识别无法正常工作。 因此,我们最终的解决方案是恢复到之前稳定版本的导航依赖项

implementation 'androidx.navigation:navigation-fragment-ktx:2.4.1'
implementation 'androidx.navigation:navigation-ui-ktx:2.4.1'

我想最好的经验法则是不要在生产中使用 alpha 构建依赖项