Android MVVM 数据与 ViewModel 的绑定


大家好,这篇文章是关于如何在你的安卓应用程序中实现安卓MVVM架构的。我想纠正这篇文章,因为我第一次使用 android MVVM 模式时遇到了很多麻烦。所以,我希望其他人不要再遇到同样的问题。

介绍

MVVM 是一种体系结构设计模式,可帮助我们完成关注点分离。它还用于构建可重用和可测试的本机Android应用程序。

什么是 MVVM?

MVVM 代表:

  • 模型— — 保存应用程序的数据。它不能直接与视图对话。通常,建议通过可观察量向视图模型公开数据。
  • 视图 — 简单地说,这是应用程序的用户界面。不包含任何应用程序逻辑。
  • 视图模型 — 它充当模型和视图之间的链接。它负责转换模型中的数据。它向视图提供数据流。它还使用挂钩或回调来更新视图。它将要求从模型中获取数据。

Android MVVM 数据与 ViewModel 的绑定
MVVM

在 android 中,有 3 种可能的方法将数据与视图模型绑定。这些是:

  1. 双向数据绑定
  2. 使用实时数据进行绑定
  3. 使用 RxJava 进行绑定

在本文中,我们将学习使用 LiveData 进行绑定。我们将使用 Kotlin 作为 PL。让我们开始吧。

项目结构

Android MVVM 数据与 ViewModel 的绑定
项目结构

添加库和依赖项

启用数据绑定和视图绑定库

为此,您需要打开build.gradle文件并启用它们,如下所示:

android {
    buildFeatures {
        viewBinding true
        dataBinding true
    }
}

添加依赖项

在依赖项部分下的 build.gradle 文件中添加这些依赖项。

implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'

在这里,您已经成功完成了第一步。让我们创建我们的模型。

创建数据模型

为了在应用程序运行时内存储数据,我们使用了一个模型。因此,让我们创建一个名为 Counter 的模型,如下所示。

 包装com.nsadisha.mvvmtest_2.模型
  
 类计数器(_count:Int){
 变量计数:Int=_count
  
 乐趣增量(){
 这个.计数+=1
 }
  
 覆盖乐趣到字符串():字符串 {
 return count.toString()
 }
 }

查看原始信息GitHub 托管❤的 Counter.kt

创建视图模型

创建视图模型,如下所示。

 包com.nsadisha.mvvmtest_2.视图模型
  
 import androidx.lifecycle.LiveData
 importandroidx.lifecycle.mutableLiveData
 导入androidx.lifecycle.ViewModel
 导入com.nsadisha.mvvmtest_2.模型。计数器
  
 类第一视图模型:视图模型() {
 privatevar_data=MutableLiveData<Counter>()。应用 {
 值=计数器(0)
 }
 valdata:LiveData<Counter>=_data
  
 乐趣增加(){
 _data.值=_data.值。应用 {
 这?。增量()
 }
 }
 }

查看原始信息FirstViewModel.ktGitHub 托管 ❤

重要

请记住,我们不能直接使用 _data.value.increment() 方法,因为它不会更新 MutableLiveData 对象中的值。因此,我们将_data.value与_data.value.apply {this?)一起分配。increament()} 到 AWOID 实时数据更新问题。

创建视图

让我们创建一个包含文本视图和按钮的简单视图。

 <?XML版本=“1.0”编码=“UTF-8”?>
 <布局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”>
  
 <数据>
 <变量
 名称=“视图模型”
 type=“com.nsadisha.mvvmtest_2.viewModel.FirstViewModel” />
 </数据>
  
 <androidx.constraintlayout.widget.ConstraintLayout
 安卓:layout_width=“match_parent”
 安卓:layout_height=“match_parent”
 工具:上下文=“.view.第一片段”>
  
 <文本视图
 android:id=“@+id/textview_first”
 安卓:layout_width=“wrap_content”
 安卓:layout_height=“wrap_content”
 android:text=“@{viewModel.data.toString()}”
 android:textSize=“24sp”
 app:layout_constraintBottom_toTopOf=“@id/button_first”
 应用:layout_constraintEnd_toEndOf=“父”
 应用:layout_constraintHorizontal_bias=“0.498”
 应用:layout_constraintStart_toStartOf=“父”
 应用:layout_constraintTop_toTopOf=“父”
 应用:layout_constraintVertical_bias=“0.421” />
  
 <按钮
 android:id="@+id/button_first"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:onClick="@{() -> viewModel.increase()}"
 android:text="@string/next"
 app:layout_constraintBottom_toBottomOf="parent"
 app:layout_constraintEnd_toEndOf="parent"
 app:layout_constraintHorizontal_bias="0.498"
 应用:layout_constraintStart_toStartOf=“父”
 应用:layout_constraintTop_toTopOf=“父”
 应用:layout_constraintVertical_bias=“0.301” />
  
 </androidx.constraintlayout.widget.ConstraintLayout>
 </布局>

查看原始信息fragment_first.xmlGitHub 托管 ❤

重要

  • 您需要记住,您需要在标签内有标签。否则它不起作用。
  • 为了绑定一个值,我们使用“@{viewModel.data}”格式。
  • 我们使用 android:onClick=“@{() -> viewModel.increase()}” 格式来绑定事件。
  • 请记住在标记中使用相同的名称。
  • 使用 android:text=“@{viewModel.data.toString()}” 格式。not android:text=“@={viewModel.data.toString()}”.

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/292597.html

(0)
上一篇 2022年11月4日
下一篇 2022年11月4日

相关推荐

发表回复

登录后才能评论