问题标签 [android-viewmodel]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2204 浏览

android - Kotlin:不可变类型对可变类型内部变量的只读访问

在 Android 中学习 ViewModel 时,出现了一个问题,感觉 Kotlin 就是要解决这个问题。在下面的代码中,我们可以看到 MutableLiveData 值正在用于编辑值和指标。但是,我们不希望这些可变值暴露给其他任何东西,特别是 Android 生命周期的成员。我们确实希望 Android 生命周期成员能够访问读取值但不能设置它们。因此,下面显示的 3 个公开函数属于 LiveData<> 不可变类型。

是否有更简单或更简洁的方法来公开可以在内部编辑的只读值?这似乎是 Kotlin 避免的:样板冗长。

可能类似的非 Android 场景是:

0 投票
1 回答
4892 浏览

android - 在片段视图模型之间传递数据

让我先说一下,这更像是一个“结构性”问题,我并不是要求任何人编写代码。我只是想弄清楚我应该如何构建我的应用程序。

我正在为我的应用程序使用 Android 的DrawerLayout/ NavigationView。这意味着它MainActivity是我所有片段的宿主。

我目前有三个片段(实际上它更多,但它们或多或少与这三个片段完全一样,只是针对不同的数据集)。

  • 列表片段
  • 细节片段
  • EditFragment(用于添加和编辑)

在我的身上ListFragment,我有(惊喜!)一个物品清单。这是一个LiveData集合SharedViewModel(与MainActivity的生命周期相关联)。当一个项目被点击时,我通过MainActivity接口监听器传递事件。

MainActivity然后加载DetailFragment. 在同一个调用中,我加载了一个SharedViewModel(再次绑定到MainActivity)的实例。我设置SharedViewModel.selectedItem为被点击的项目。然后,在DetailFragment'sonCreate函数中,我通过ViewModelProviders.of(activity).get(SharedViewModel::class.java).selectedItem.

在 上DetailFragment,有一个编辑按钮。这或多或少地经历了上述相同的例程,但加载的是EditFragment相反的。保存编辑/添加的项目时,我通过的接口侦听器添加/替换SharedViewModel集合中的项目。MainActivity

显然,由于几个原因,这不是最优的。一方面,这意味着我至少有五组大型数据在MainActivity的生命周期中(本质上是应用程序的整个生命周期)。此外,MainActivity由于我必须添加越来越多的函数来处理事件,因此变得失控。

想要做的是,例如,我在 a 上的项目列表与ListFragmentViewModelListFragment生命周期相关联。我在 a 上选择的项目DetailFragmentViewModel,我在 an 上的编辑项目EditFragmentViewModel等。

我的问题是我不确定在这种情况下如何正确传递数据。例如,假设我在EditFragment. 我如何将它放入ListFragmentViewModel's 的项目集合中?ListFragment位于后台堆栈中,因此它的视图模型会挂起,并且在导航回时不会重新加载数据,因为它仍然具有之前的集合。这是有道理的,并且可能应该是这样(毕竟,谁愿意等待所有数据在DetailFragment返回和返回时加载ListFragment?),但这意味着我没有在集合中获得我的新项目。

这只是一个例子,但我遇到了很多类似的问题(例如,将所选项目传递给DetailFragmentViewModel.)

我不太确定我什至应该去哪里。有经验的人能帮帮我吗?

0 投票
1 回答
4065 浏览

android - 将 LiveData 与包含的不同对象合并

所以我正在使用 Room 和 LiveData 编写一个应用程序。这是一个金融应用程序。我有两个要合并的实体,PayeeTransactionTransaction有一个 ForeignKey 将其链接到Payee。我一直使用 Room 中的 LiveData(Daos、Repository、ViewModels)到我的 UI(片段)。

在达到片段级别之前,我想在某个级别合并这两个数据集,但不知道该怎么做。我知道我可以直接从数据库中创建一个带有查询的 POJO,但我有点想要一个带有Payee的事务对象,而不是两者中的所有字段。

有没有办法做到这一点?也许使用其中一种转换(map 或 switchMap)?或者也许使用 MediatorLiveData?他们能否观察到不止一种数据类型(例如 LiveData 和 LiveData)?

收款人.java

事务.java

0 投票
2 回答
4839 浏览

android - Android Architecture Components: Multiple instances of the same view model

I'm new to Android Architecture Components and I have read this tutorial. I'm interested in the part where it said:

This allows you to have an app that opens a lot of different instances of the same Activity or Fragment, but with different ViewModel information. Let’s imagine if we extended our Court-Counter example to have the scores for multiple basketball games. The games are presented in a list, and then clicking on a game in the list opens a screen that looks like our current MainActivity, but which I’ll call GameScoreActivity.

Let's say I have a ViewModel MyViewModel. And I want to create a list of this view model but I don't know the number of elements in this list until runtime. Is it convenient to create the view model instances inside a for loop? How many instances am I allowed to create? Will the number of instances affect performance?

0 投票
7 回答
25952 浏览

android - 无法创建 ViewModel 类的实例(无法启动活动 ComponentInfo)

我在我的项目中使用 MVVM、Retrofit、LiveData,但在看到这些链接之前我收到了这个错误

错误

视图模型

我认为问题出在我的构造函数中

存储库

活动课

我应该在我的项目和定制工厂中使用 Dagger 吗?

0 投票
1 回答
1658 浏览

java - Android架构组件如何用ViewModel实现对象的双向绑定

这是一个非常基本的视图模型

我正在尝试实现两种方式绑定,如下所示

这可以按预期工作,但是在绑定对象时:

我收到一个错误:无法反转表达式 viewModelPersonGetValue.getName():双向绑定无法解析 java.lang.String 属性“名称”的设置器

看来我错过了一些东西,有什么想法吗?

(我使用的是 Android Studio 3.2 canary 1)

0 投票
2 回答
11346 浏览

android - Service 中的 Android ViewModel(替代方案)

我有一项服务,它提供大多数时间对用户可见的 UI。

当我遇到问题时,我正在尝试新的应用程序架构。

MyModelviewModel viewModel = ViewModelProviders.of(this).get(MyModelviewModel.class);

但如你所知this,只能是AppCompatFragment

有其他选择吗?或者我可以把观察者直接放在我LiveData喜欢的人身上吗ViewModel

0 投票
1 回答
851 浏览

android - 对函数类型参数空行为的弱引用

我知道如果不再需要弱引用作为强引用(例如 Activity 被销毁或 ViewModel 被清理),WeakReference 将允许垃圾收集器清理其引用。但是我试图理解这样一种情况:当函数拥有的实例没有被垃圾收集时,我对函数的 WeakReference 在随机点返回空引用......

考虑以下 ViewModel:

我将原始 LiveData 的结果传递给 AsyncTask 以供进一步处理,并将函数类型引用传递给 setValue,以便 AsyncTask 可以在 onPostExecute() 中调用中介的 setValue()。

考虑以下 AsyncTask:

我认为只要未在 ViewModel 上调用 onCleared() 并且未对它进行垃圾收集,WeakReference 将始终包含非空引用。但碰巧有两种情况,我见过 mOnFinishCallback.get() 返回 null。

  1. 在应用程序运行时,通过按运行 (Shift + F10) 通过 Android Studio 重新启动应用程序。该应用程序将关闭,重新启动,并且我之前有项目的 RecyclerView 现在是空白的。通过一些系统输出,我可以看到 WeakReference 有一个空引用。
  2. 在通过 FAB 将新项目添加到列表中(通过 DAO 实例处理插入)并查看我的日志时,大多数时间 WeakReference 仍在引用我的 MediatorLiveData 的 setValue() 函数,但在随机时间它将为空,但是下次我插入一个项目并重复此过程时,它不为空。

知道为什么会这样吗?如果我的 ViewModel 以及 MediatorLiveData 仍然处于活动状态并且没有被垃圾收集,那么 MediatorLiveData 的 setValue() 函数引用是否应该一直有效?

0 投票
0 回答
1602 浏览

android - Android ViewModelProvider.Factory:引起:java.lang.RuntimeException:无法创建类GameViewModel的实例

我正在尝试创建一个 ViewModelFactory 来创建我的 ViewModel。

工厂类是:

我也尝试过扩展,ViewModelProvider.AndroidViewModelFactory(application)但结果是一样的。

ViewModel 类的构造函数是:

我在片段中完全调用它的方式如下:

问题来了,它似乎没有得到它,我认为这可能是因为Application对象。我已经尝试在我的GameApplication班级中创建一个单例,但它仍然是一样的:

非常感谢!

编辑:如果我调试并进入 VieWModelProvider 类,我会看到它到达AndroidViewModelFactory该类并进入getcreate 方法。然后它尝试返回modelClass.getConstructor(Application.class).newInstance(mApplication),但随后抛出以下内容RuntimeException

0 投票
0 回答
582 浏览

android - 在多个viewmodels android架构组件中访问相同的数据存储库

我有一个负责与我的 dao 对话的数据存储库

然后我有 2 个视图模型,它们在存储库上获取一个实例,但一个视图模型总是将我的实时数据对象返回为空,另一个工作正常

任何人都知道可能会发生什么,是因为另一个 ViewModel 首先引用了 LiveData 对象并且只允许一个引用吗?