Kotlin使用by viewModels()委托出现Unresolved Reference错误怎么解决?
问题排查结果及修复方案
- 核心错误:
by viewModels()属性委托的使用场景错误。你将声明ViewModel实例的代码写在了GameViewModel类内部,而viewModels()是Fragment/Activity的专属扩展函数,只能在Fragment或Activity类中调用,无法在ViewModel内部使用,因此触发接收器类型不匹配的报错。 - 修复步骤:
- 将
private val viewModel: GameViewModel by viewModels()这行代码从GameViewModel类中移除,移动到对应的GameFragment或者宿主Activity类中。 - 修正后的
GameViewModel代码示例:
class GameViewModel : ViewModel() { init { Log.d("GameViewModel", "GameViewModel created!") } private var score = 0 private var currentWordCount = 0 private var _currentScrambledWord = "test" val currentScrambledWord: String get() = _currentScrambledWord override fun onCleared() { super.onCleared() Log.d("GameViewModel", "GameViewModel destroyed!") } }- Fragment中调用ViewModel的示例:
class GameFragment : Fragment() { // viewModels委托写在Fragment内部 private val viewModel: GameViewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 正常调用viewModel的属性和方法 Log.d("GameFragment", "当前乱序单词:${viewModel.currentScrambledWord}") } } - 将
- 其他说明:你提供的依赖配置没有问题,不需要调整依赖,仅修改代码位置即可解决报错。
内容的提问来源于stack exchange,提问作者Nicolas Briand
相关产品推荐
相关产品推荐

