首页 > 解决方案 > 存储后如何从片段中的视图模型中重复调用数据?

问题描述

我是 android 中 mvvm 架构的新手。我正在将数据从 Fragment A 传递到 B 。我想将该数据存储在 Frag B 的视图模型中并根据需要使用。据我了解,我需要在视图模型中定义两个这样的方法

 private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

    public void select(Item item) {
        selected.setValue(item);
    }

    public LiveData<Item> getSelected() {
        return selected;
    }

并在片段中观察它

model.getSelected().observe(getViewLifecycleOwner(), { item ->
       // Update the UI.
    });

这很好,因为最初在 oncreate 中调用了 setitem 并且我正在获取数据。但是如果我在不同的时间片段中因为几个不同的原因重复需要这个Item数据,并且这个数据不会改变,那么如何使用该方法

getSelected()

因为我只使用了一次观察者,并且需要调用诸如 getdata 或 post data 之类的事件才能触发该事件。那么如何实现呢。

是不是我需要通过另一种方法多次调用 getvalue() 方法?我不确定这是否是正确的方法。请说清楚。

谢谢 :)

标签: androidandroid-mvvm

解决方案


.observe方法不仅会观察一次,而且会在每次 livedata 更改其值时触发。据我所知,调用.getValue()获取 livedata 的值没有任何问题,但是由于您已经设置了一个观察者,您可以在那里更新您的类的 item 变量:

class MyClass{
       val myItem: Item

在 onCreate 中:

model.getSelected().observe(getViewLifecycleOwner(), { item ->
       // Update the UI.
       myItem = item
    });

编辑:要回答您的评论,您可以使用.getValue(),它没有任何问题。根据文档

确保 Activity 或 Fragment 具有一旦激活就可以显示的数据。一旦应用程序组件处于 STARTED 状态,它就会从它正在观察的 LiveData 对象中接收最新值。这仅在设置了要观察的 LiveData 对象时发生。

因此,当您启动组件时,onCreate您将收到最新的项目值,只要它已设置。它不需要被改变。您将在整个组件中拥有相同的值,如果 livedata 发生更改,您的myItem也会更新。


推荐阅读