ViewPager2中Fragment使用DataBinding时TextView绑定LiveData调用postValue无效问题
问题解决方案
核心原因
你遇到的postValue不更新UI但点击事件正常的问题,是DataBinding未设置生命周期所有者导致的:
- 点击事件属于静态一次性绑定,在赋值
mBinding?.signUp = vm时就完成了引用关联,不需要后续响应式更新,所以可正常触发 - 绑定到LiveData的UI属性,需要DataBinding持有LifecycleOwner才能观察LiveData的数值变化,没有设置的情况下LiveData更新不会通知UI刷新
修复步骤
1. 给DataBinding设置LifecycleOwner,修改FragmentA代码
同时修正inflate时attachToRoot参数错误(Fragment的onCreateView不需要手动将View挂载到父容器,系统会自动处理),补充View销毁时的绑定清空逻辑避免内存泄漏:
class SignUpMainFragment:Fragment() { private var mBinding:FragmentSignUpMainBinding?=null // 官方推荐的共享宿主Fragment ViewModel的写法,不需要手动传参 private val vm:SignUpFragmentVM by viewModels( ownerProducer = { requireParentFragment() } ) override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_sign_up_main,container,false) // 必须设置,DataBinding才能感知生命周期,观察LiveData更新UI mBinding?.lifecycleOwner = viewLifecycleOwner mBinding?.signUp = vm return mBinding?.root!! } override fun onDestroyView() { super.onDestroyView() // 清空绑定避免内存泄漏 mBinding = null } }
2. 可选优化:移除宿主Fragment中手动传递ViewModel的逻辑
你之前应该是在宿主Fragment创建SignUpMainFragment实例时手动传入了VM实例,这种写法在Fragment系统重建时会导致VM实例丢失,改用上面的by viewModels方式获取后,不需要再手动传参。
内容的提问来源于stack exchange,提问作者GaleLiu
相关产品推荐
相关产品推荐

