问题标签 [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.
android - Kotlin:不可变类型对可变类型内部变量的只读访问
在 Android 中学习 ViewModel 时,出现了一个问题,感觉 Kotlin 就是要解决这个问题。在下面的代码中,我们可以看到 MutableLiveData 值正在用于编辑值和指标。但是,我们不希望这些可变值暴露给其他任何东西,特别是 Android 生命周期的成员。我们确实希望 Android 生命周期成员能够访问读取值但不能设置它们。因此,下面显示的 3 个公开函数属于 LiveData<> 不可变类型。
是否有更简单或更简洁的方法来公开可以在内部编辑的只读值?这似乎是 Kotlin 避免的:样板冗长。
可能类似的非 Android 场景是:
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 上的项目列表与ListFragmentViewModel
的ListFragment
生命周期相关联。我在 a 上选择的项目DetailFragmentViewModel
,我在 an 上的编辑项目EditFragmentViewModel
等。
我的问题是我不确定在这种情况下如何正确传递数据。例如,假设我在EditFragment
. 我如何将它放入ListFragmentViewModel
's 的项目集合中?ListFragment
位于后台堆栈中,因此它的视图模型会挂起,并且在导航回时不会重新加载数据,因为它仍然具有之前的集合。这是有道理的,并且可能应该是这样(毕竟,谁愿意等待所有数据在DetailFragment
返回和返回时加载ListFragment
?),但这意味着我没有在集合中获得我的新项目。
这只是一个例子,但我遇到了很多类似的问题(例如,将所选项目传递给DetailFragmentViewModel
.)
我不太确定我什至应该去哪里。有经验的人能帮帮我吗?
android - 将 LiveData 与包含的不同对象合并
所以我正在使用 Room 和 LiveData 编写一个应用程序。这是一个金融应用程序。我有两个要合并的实体,Payee和Transaction。 Transaction有一个 ForeignKey 将其链接到Payee。我一直使用 Room 中的 LiveData(Daos、Repository、ViewModels)到我的 UI(片段)。
在达到片段级别之前,我想在某个级别合并这两个数据集,但不知道该怎么做。我知道我可以直接从数据库中创建一个带有查询的 POJO,但我有点想要一个带有Payee的事务对象,而不是两者中的所有字段。
有没有办法做到这一点?也许使用其中一种转换(map 或 switchMap)?或者也许使用 MediatorLiveData?他们能否观察到不止一种数据类型(例如 LiveData 和 LiveData)?
收款人.java
事务.java
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?
android - 无法创建 ViewModel 类的实例(无法启动活动 ComponentInfo)
我在我的项目中使用 MVVM、Retrofit、LiveData,但在看到这些链接之前我收到了这个错误
错误
视图模型
我认为问题出在我的构造函数中
存储库
活动课
我应该在我的项目和定制工厂中使用 Dagger 吗?
java - Android架构组件如何用ViewModel实现对象的双向绑定
这是一个非常基本的视图模型
我正在尝试实现两种方式绑定,如下所示
这可以按预期工作,但是在绑定对象时:
我收到一个错误:无法反转表达式 viewModelPersonGetValue.getName():双向绑定无法解析 java.lang.String 属性“名称”的设置器
看来我错过了一些东西,有什么想法吗?
(我使用的是 Android Studio 3.2 canary 1)
android - Service 中的 Android ViewModel(替代方案)
我有一项服务,它提供大多数时间对用户可见的 UI。
当我遇到问题时,我正在尝试新的应用程序架构。
MyModelviewModel viewModel = ViewModelProviders.of(this).get(MyModelviewModel.class);
但如你所知this
,只能是AppCompat
或Fragment
有其他选择吗?或者我可以把观察者直接放在我LiveData
喜欢的人身上吗ViewModel
android - 对函数类型参数空行为的弱引用
我知道如果不再需要弱引用作为强引用(例如 Activity 被销毁或 ViewModel 被清理),WeakReference 将允许垃圾收集器清理其引用。但是我试图理解这样一种情况:当函数拥有的实例没有被垃圾收集时,我对函数的 WeakReference 在随机点返回空引用......
考虑以下 ViewModel:
我将原始 LiveData 的结果传递给 AsyncTask 以供进一步处理,并将函数类型引用传递给 setValue,以便 AsyncTask 可以在 onPostExecute() 中调用中介的 setValue()。
考虑以下 AsyncTask:
我认为只要未在 ViewModel 上调用 onCleared() 并且未对它进行垃圾收集,WeakReference 将始终包含非空引用。但碰巧有两种情况,我见过 mOnFinishCallback.get() 返回 null。
- 在应用程序运行时,通过按运行 (Shift + F10) 通过 Android Studio 重新启动应用程序。该应用程序将关闭,重新启动,并且我之前有项目的 RecyclerView 现在是空白的。通过一些系统输出,我可以看到 WeakReference 有一个空引用。
- 在通过 FAB 将新项目添加到列表中(通过 DAO 实例处理插入)并查看我的日志时,大多数时间 WeakReference 仍在引用我的 MediatorLiveData 的 setValue() 函数,但在随机时间它将为空,但是下次我插入一个项目并重复此过程时,它不为空。
知道为什么会这样吗?如果我的 ViewModel 以及 MediatorLiveData 仍然处于活动状态并且没有被垃圾收集,那么 MediatorLiveData 的 setValue() 函数引用是否应该一直有效?
android - Android ViewModelProvider.Factory:引起:java.lang.RuntimeException:无法创建类GameViewModel的实例
我正在尝试创建一个 ViewModelFactory 来创建我的 ViewModel。
工厂类是:
我也尝试过扩展,ViewModelProvider.AndroidViewModelFactory(application)
但结果是一样的。
ViewModel 类的构造函数是:
我在片段中完全调用它的方式如下:
问题来了,它似乎没有得到它,我认为这可能是因为Application
对象。我已经尝试在我的GameApplication
班级中创建一个单例,但它仍然是一样的:
非常感谢!
编辑:如果我调试并进入 VieWModelProvider 类,我会看到它到达AndroidViewModelFactory
该类并进入get
create 方法。然后它尝试返回modelClass.getConstructor(Application.class).newInstance(mApplication)
,但随后抛出以下内容RuntimeException
:
android - 在多个viewmodels android架构组件中访问相同的数据存储库
我有一个负责与我的 dao 对话的数据存储库
然后我有 2 个视图模型,它们在存储库上获取一个实例,但一个视图模型总是将我的实时数据对象返回为空,另一个工作正常
任何人都知道可能会发生什么,是因为另一个 ViewModel 首先引用了 LiveData 对象并且只允许一个引用吗?