gpt4 book ai didi

android - 弹出 fragment 后的多个 LiveData 观察者

转载 作者:IT老高 更新时间:2023-10-28 13:39:46 24 4
gpt4 key购买 nike

问题

总结:在导航到新 Fragment、弹出新 Fragment 并返回原始 fragment 。

详细信息:该架构由 MainActivity 组成,其中承载一个 HomeFragment 作为 MainActivity 的 开始目的地 strong>导航图。 HomeFragment 内部是一个以编程方式膨胀的 PriceGraphFragmentHomeFragment 正在使用导航组件来启动一个新的子 Fragment ProfileFragment。按下后,ProfileFragment 被弹出,应用程序返回到承载 PriceGraphFragment 的 HomeFragment。 PriceGraphFragment 是 Observer 被多次调用的地方。

我正在记录观察者发出的 HashMap 的哈希码,当我转到配置文件 fragment 、弹出配置文件 fragment 并返回价格 fragment 时,它显示了 2 个唯一的哈希码。这与我在不启动配置文件 fragment 的情况下旋转屏幕时从 HashMap 看到的一个哈希码相反。

实现

  1. 用于在 HomeFragment 中启动新 ProfileFragment 的导航组件。

    view.setOnClickListener(Navigation.createNavigateOnClickListener(
    R.id.action_homeFragment_to_profileFragment, null))

  2. ViewModel 在 Fragment (PriceGraphFragment) 中创建。 ViewModel 已经被记录,拥有多个 Observer 的数据只有在 ViewModel 中初始化过一次。

    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    priceViewModel = ViewModelProviders.of(this).get(PriceDataViewModel::class.java)
    }

  3. 在原始 Fragment (PriceGraphFragment) 中监听来自 ViewModel 的数据。这会被多次调用,但是在加载 Fragment 时它只需要一个 Observer。

    priceViewModel.graphLiveData.observe(
    this, Observer { priceGraphDataMap: HashMap<Exchange, PriceGraphLiveData>? ->
    // This is being called multiple times.
    })

尝试的解决方案

  1. onCreate() 方法中创建 FragmentViewModelpriceViewModel = ViewModelProviders.of(this).get(PriceDataViewModel::class.java)
  2. 使用 Fragment 的 Activity 和子 Fragment 的父 Fragment 创建 ViewModel。
    priceViewModel = ViewModelProviders.of(activity!!).get(PriceDataViewModel::class.java)

    priceViewModel = ViewModelProviders.of(parentFragment!!).get(PriceDataViewModel::class.java)

  3. 将创建观察者的方法移动到 Fragment 的 onCreate()onActivityCreated() 方法。
  4. 使用 viewLifecycleOwner而不是 this用于方法observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) 中的LifecycleOwner .
  5. 存储在 ViewModel 中显示为重复的 HashMap 数据,而不是 Fragment。
  6. 使用 ChildFragmentManager 启动子 Fragment和 SupportFragmentManager (在 Activity 级别)。

类似问题和建议的解决方案

后续步骤

  • 也许问题与在 ParentFragment 的 (HomeFragment 中创建嵌套的 ChildFragment (PriceGraphFragment) 有关>) onViewCreated() ?

父 fragment

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
user = viewModel.getCurrentUser()
if (savedInstanceState == null) {
fragmentManager
?.beginTransaction()
?.replace(binding.priceDataContainer.id,
PriceGraphFragment.newInstance())
?.commit()
}
  • 测试用 RxJava 可观察对象替换 LiveData 对象。

最佳答案

这基本上是架构中的一个错误。您可以阅读更多信息 here .您可以通过在 observer 中使用 getViewLifecycleOwner 而不是这个来解决它。

像这样:

mViewModel.methodToObserve().observe(getViewLifecycleOwner(), new Observer<Type>() {
@Override
public void onChanged(@Nullable Type variable) {

并将这段代码放在onActivityCreated()中,因为getViewLifecycleOwner的使用需要一个 View 。

关于android - 弹出 fragment 后的多个 LiveData 观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51892478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com