使用空构造函数构造的 SavedStateViewModelFactory

Vah*_*yan 8 android viewmodel kotlin savedstateviewmodelfactory

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

java.lang.RuntimeException:无法启动活动 ComponentInfo{com.atcc.aewp/com.atcc.aewp.activity.SplashActivity}:java.lang.UnsupportedOperationException:使用空构造函数构造的 SavedStateViewModelFactory 仅支持调用 create(modelClass: Class,额外内容:CreationExtras)。

加载视图模型时抛出异常

open class BaseActivity : AppCompatActivity() {

    private val appLanguageViewModel: AppLanguageViewModel by viewModels()

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

        appLanguageViewModel.result.observe(this) {
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的视图模型类

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))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sin*_*zak 10

解决方法;

    private val viewModel: AppLanguageViewModel by viewModels {
      SavedStateViewModelFactory(application, this)
    }
Run Code Online (Sandbox Code Playgroud)

原因;

因为并不是所有东西都使用 ViewModelFactory 的新 API。ComponentActivity 中的默认工厂是 SavedStateViewModelFactory,没有任何构造函数参数。

我们遇到了 HiltViewModelFactory 的问题。它调用 create 方法而不传递新的 CreationExtras 值。我认为在我们的例子中这应该固定在刀柄上。如果您可以分享堆栈跟踪的其余部分,我们也可能会找出您案例的根本原因。