当前位置: 首页 > 知识库问答 >
问题:

Android,如何在同一个ViewModel中观察LiveData

宰父夕
2023-03-14

对于LiveData和MVVM架构,我完全是个新手。我想知道如何观察一个实时数据

我通过以下方式从我的房间数据库中获取实时数据:

class MealsViewModel @Inject constructor(
    private val mealDao : MealDao
) : ViewModel() {

    ...

    private val currentDay: MutableLiveData<Date> = MutableLiveData(Date())
    val meals = Transformations.switchMap(currentDay){ date -> mealDao.getMeals(date).asLiveData() }

我希望ViewModel中的另一个变量,private val empty:Boolean,在列表返回空(null)时进行更新。这将用于从Visible更新片段中的ImageView。去看电视了。看得见的

我如何检查如果val餐是空的同步?

我四处阅读,看到一些人说使用观察永远,但是架构指南明确建议不要使用ViewModel中的任何观察者。

我可能可以观察片段中的LiveData,但这需要片段中的业务逻辑,即:

viewModel.meals.observe(viewLifecycleOwner) {

    if meals.value.isEmpty() imageView.visibility = View.VISIBLE else imageView.visibility = View.GONE
}

我想让片段尽可能“哑”,所以我更喜欢在视图模型中有这样的逻辑。这可能吗?

共有2个答案

廉高邈
2023-03-14

我不知道你的代码是如何设置的,但是你可以做下面这样的事情

向ViewModel添加变量

val empty = MutableLiveData<Boolean>()

在<代码>用餐观察者视图模型中。餐。观察(viewLifecycleOwner){

viewModel.empty,postValue(meals.value.isEmpty())

然后从观察

使用LiveData

在ViewModel类中,创建

val empty = MediatorLiveData<Boolean>()

然后

empty.addSource(meals) {
    empty.value = it.isEmpty()
}
松越
2023-03-14

您可以检查实时数据meat以查看它是空的还是空的,然后用您的实时数据empty触发,如下所示:

在viewmodel中,创建一个livedataIsEmptymals。当餐食值更改时,此live data变量将始终触发,并将检查您的餐食值是否为空。

MealsViewModel。kt

class MealsViewModel @Inject constructor(
    private val mealDao : MealDao
) : ViewModel() {

    ...

    private val currentDay: MutableLiveData<Date> = MutableLiveData(Date())
    val meals = Transformations.switchMap(currentDay){ date -> mealDao.getMeals(date).asLiveData() }
    
    val isEmptyMeals = meals.map {
        it.isNullOrEmpty()
    }
}

在片段中,您将收听观察livedataIsEmptymals,并执行隐藏或显示所需图像视图的逻辑。

碎片kt

viewModel.isEmptyMeals.observe(viewLifecycleOwner) {
    imageView.visibility = if (it) View.VISIBLE else View.GONE
}
 类似资料:
  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?

  • 我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们。现在我希望将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从数据提取类返回的LiveData对象。observe方法需要一个LifecycleOwner对象作为第一个参数,但我的ViewModel中显然没有这个对象,而且我知道我不应该在ViewModel中保留对ac

  • 我正在研究Android架构组件,我有点困惑。在这个示例中,它们使用一个存储库,并通过ViewModels观察存储库数据源中的更改。我不明白datasource中的更改是如何推送到ViewModels的,因为在ViewModels中看不到将它们订阅到存储库的任何代码。类似地,片段观察ViewModel的LiveData,但它们实际上订阅了LiveData: 我在ViewModels中看不到任何类型

  • 我正在寻找在中观察数据的最佳方法。 我正在使用MVVM数据绑定。 存储库: 它从服务器请求数据并返回实时数据。ViewModel必须观察数据更改。 视图模型: ViewModel使用一个来观察来自存储库的的变化。我添加了数据作为源来观察变化,并在它触发后将其删除,以防止在我多次获取数据时多次触发事件。并且必须有一个虚假的观察者来观察,因此触发器的onChange方法。 比方说,我只需要数据来隐藏/

  • 对于片段,建议将liveData观察器放在onActivityCreated方法中。这对片断很有效,但是当我将它应用于dialogFragment时,我会得到以下错误: IllegalStateException:当getView()为空时,即在onCreateView()之前或onDestroyView()之后,无法访问Fragment视图的LifecycleOwner。 从这个问题中,我了解到

  • 如何深入观察数组中的对象? 有一个现场演示:http://jsfidle.net/syx9b/