You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:30:27