ViewModelProviders在Fragment中无法使用的问题求助
看起来你是在尝试通过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) } }
额外优化建议
- 使用最新的ViewModelProvider:ViewModelProviders已经被官方废弃了,推荐用ViewModelProvider替代,代码更简洁:
sharedViewModel = ViewModelProvider(requireActivity()).get(SharedViewModel::class.java)
- 修正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
相关产品推荐
相关产品推荐

