使用空构造函数构造的 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 构建依赖项
将 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 构建依赖项