使用Dagger+ViewModel+SavedState时遇getDefaultViewModelProviderFactory重写错误
解决
getDefaultViewModelProviderFactory overrides nothing错误 问题原因
getDefaultViewModelProviderFactory()是AndroidX ComponentActivity类中的方法,出现该错误的核心原因有两个:
- 你的
BaseActivity未继承ComponentActivity或其子类(如AppCompatActivity),导致父类不存在可重写的该方法; - 相关类导包错误,比如误导入了旧架构的
android.arch.lifecycle包而非AndroidX的androidx.lifecycle。
解决方案
1. 修正BaseActivity的继承关系
确保你的BaseActivity继承自AndroidX的AppCompatActivity(或直接继承ComponentActivity):
abstract class BaseActivity : AppCompatActivity() { // 你的BaseActivity原有代码 }
2. 检查并修正导包
在AccountActivity中,确认以下类的导包为AndroidX版本:
import androidx.lifecycle.ViewModelProvider import androidx.appcompat.app.AppCompatActivity
3. 清理缓存并重新构建
执行以下操作解决潜在的缓存或依赖同步问题:
- 点击
File -> Invalidate Caches... -> Invalidate and Restart重启Android Studio - 重新同步Gradle项目(点击工具栏的Sync Project with Gradle Files按钮)
4. 备选方案:直接在ViewModel委托中指定工厂
如果不想重写getDefaultViewModelProviderFactory方法,可以直接在by viewModels()中传入自定义工厂,避免重写方法的问题:
class AccountActivity : BaseActivity() { @Inject lateinit var abstractViewModelFactory: dagger.Lazy<InjectingSavedStateViewModelFactory> // 直接在viewModels委托中传入工厂 private val viewModel: AccountViewModel by viewModels { abstractViewModelFactory.get().create(this) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 确保Dagger注入完成(如果BaseActivity未处理,需在此调用AndroidInjection.inject(this)) viewModel.getMenuItems() setContent { // Compose内容 } } }
额外验证点
- 确认
InjectingSavedStateViewModelFactory中返回的AbstractSavedStateViewModelFactory是AndroidX的androidx.lifecycle.AbstractSavedStateViewModelFactory; - 确保Dagger注入在
onCreate之前完成,比如在BaseActivity的onCreate方法中调用AndroidInjection.inject(this)。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

