如何解决数据绑定:ViewModel不应引用视图,但是...?
先决条件
是的,有很多类似的问题,但是我找不到这个特定问题的答案:显然,最好不要让viewModel持有对Android框架类以及视图的任何引用。 但是!
如果我使用数据绑定,则可以具有如下所示的xml布局:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewModel"
type="SomeViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Button
android:id="@+id/myButtpn"
style="@style/mybuttonStyle"
android:onClick="@{viewModel::onButtonClicked}"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
现在,这有望在我的SomeViewModel
中找到这样的方法:
fun onButtonclicked(view: View) {
// I don't need the parameter,but Android needs it to be there
}
但是我也可以在布局中引用这样的方法:
android:onClick="@{() -> viewModel.onButtonClicked()}"
现在我在viewModel中的方法不需要查看视图:
fun onButtonclicked() {
// all fine
}
实际问题:
实际上有什么不同吗?显然,我将viewModel视图显示为函数参数,然后将其忽略,因此它看起来并不好,而且似乎有点浪费。但据我所知,viewModel绝不保留对它们的任何引用。那么这有什么不好吗?
另一方面,将此lambda放入xml看起来并不那么性感,但这似乎是典型的做法。它是否有(Dis-)Advantage?
第三:两种方法在性能方面是否会有区别?
解决方法
Does it actually make a difference? Obviously,I am presenting the viewModel views as function parameters,that then get ignored,so this doesn't look great and seems a bit wasteful. But at no time the viewModel holds any reference to them,in my understanding. So is this bad in any way?
您不希望ViewModel保留对Views的引用的最大原因之一是因为您的ViewModel
的生命周期超过了Fragment
。现在您出现了内存泄漏。
此外,通常应使用ViewModel
(s)来公开公共值,这些公共值继而驱动UI按照许多MVVM模式中的指定进行更新和布局。
实质上,databinding
允许您通过删除将这些项目绑定到Fragment中的Views
所需的所有样板代码来执行此操作。您会看到Android生成了databinding
类,正是这个类。
On the other hand,putting this lambda into the xml doesn't look so sexy,but it seems to be the typical practice. Doies it have any (Dis-)Advantages?
除了构建时间性能外,没有其他缺点。自从您有了这些databinding
代码生成以来,在切换当前模块中的内容时,您将在构建期间生成更多代码。
这不是看起来不性感的问题,而是减少将ViewModel
绑定到视图的样板代码。如果您不在xml
中执行此操作,则将在Fragment
或Activity
中执行此操作。字面上是同一回事。
And third: Would there be any difference between the two approaches in terms of performance?
我假设运行时性能好吗?不,没有好处,也没有弊端。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。