android 使用空构造函数构造的SavedStateViewModelFactory

mm9b1k5b  于 2022-12-25  发布在  Android
关注(0)|答案(2)|浏览(235)

在将navigation组件和lifecycle viewmodel版本更新为2.5.0-alpha01后,我遇到了以下问题。
java.lang.RuntimeException:无法启动活动组件信息{com. atcc. aewp/com. atcc. aewp.活动启动活动}:不支持的操作异常:使用空构造函数构造的SavedStateViewModelFactory仅支持对create(modelClass:类,额外:创作附加)。
加载视图模型时引发异常

open class BaseActivity : AppCompatActivity() {

    private val appLanguageViewModel: AppLanguageViewModel by viewModels()

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

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

下面是我的视图模型类

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))
        }
    }
}
ztigrdn8

ztigrdn81#

变通方案;

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

原因;
因为不是所有的东西都使用ViewModelFactory的新API,ComponentActivity中默认的工厂是SavedStateViewModelFactory,没有任何构造函数参数。
我们有一个问题与HiltViewModelFactory。它调用创建方法没有传递新的CreationExtras值。我假设这应该是在我们的情况下解决。如果你可以分享堆栈跟踪的其余部分,我们可能会找到根本原因在您的情况了。

mqkwyuun

mqkwyuun2#

在我们的案例中希南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'

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

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

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

相关问题