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

ViewModelProviders在Fragment中无法使用的问题求助

解决Fragment中实例化SharedViewModel的报错问题

看起来你是在尝试通过SharedViewModel在Fragment和宿主Activity之间共享ArrayList数据,但Fragment里实例化ViewModel时踩了坑。别担心,我来帮你梳理下问题和解决办法:

问题根源

你在Fragment中实例化ViewModel时,应该绑定到宿主Activity的生命周期,而不是Fragment自己的。如果误用了Fragment的上下文(比如this),就会出现需要FragmentActivity的报错——因为共享ViewModel是和Activity共享的,必须关联到Activity的ViewModelStore。

正确的Fragment实现代码

把Fragment中的ViewModel实例化代码改成这样:

class YourTargetFragment : Fragment() {
    private lateinit var sharedViewModel: SharedViewModel

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // 核心:用requireActivity()获取宿主Activity的ViewModel实例
        sharedViewModel = ViewModelProviders.of(requireActivity()).get(SharedViewModel::class.java)
        return inflater.inflate(R.layout.fragment_your_layout, container, false)
    }

    // 举个例子:在Fragment中设置数据到ViewModel
    private fun submitPersonList() {
        val testPersonList = arrayListOf(
            Person("张三", 28),
            Person("李四", 32)
        )
        sharedViewModel.setPersonArray(testPersonList)
    }
}

额外优化建议

  1. 使用最新的ViewModelProvider:ViewModelProviders已经被官方废弃了,推荐用ViewModelProvider替代,代码更简洁:
sharedViewModel = ViewModelProvider(requireActivity()).get(SharedViewModel::class.java)
  1. 修正Activity中的Observer写法:你原来的Activity代码里Observer的lambda表达式语法有点小问题,调整成这样更清晰:
viewModel.getPersonArray.observe(this) { personList ->
    Log.d("Array:", "获取到的列表:$personList")
}

关键注意点

  • 永远不要在共享ViewModel场景下,用Fragment的this或者viewLifecycleOwner去实例化ViewModel,那样会创建一个仅属于Fragment的ViewModel实例,达不到共享数据的目的
  • requireActivity()会确保获取到宿主的FragmentActivity实例,避免空指针(如果Fragment已经脱离Activity,会抛出合理的异常)

内容的提问来源于stack exchange,提问作者SNM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:51:25