浅谈mvvm+jetpack的用法

120 阅读2分钟

我们为什么要使用这种方式进行代码的开发

传统的方式:

1.违背单一原则,(职责过多)

2.代码臃肿,不便于管理

3.非常的依赖activiry或者Fragment

...

jetpck方式:

1.体现单一原则

2.分层清晰

3.解耦,降低对activiry或者Fragment的依赖

...

先看下展示的效果

截屏2023-05-18 上午9.20.06.png

保证activiry的单一职责原则,只进行管理和绑定的工作,我们不在activiry中进行过多的逻辑的操作,我们将数据的操作放到viewmodle中进行操作

MainViewModle

//感应数据的变化
private MutableLiveData<String> phoneInfo;//展示手机号
private MutableLiveData<Boolean> isShow;//设置键盘的展示和隐藏

public MutableLiveData<String> getPhoneInfo() {
    if (phoneInfo == null) {
        phoneInfo = new MutableLiveData<>();
        phoneInfo.setValue("");//设置默认值
    }
    return phoneInfo;
}
....自己的其他的逻辑
....
/**
 * 输入
 */
public void InPutNumber(String number) {
    phoneInfo.setValue(phoneInfo.getValue() + number);
}


如果我们的的viewmodle需要获取环境的做操作的时候需要继承AndroidViewModel这样就能获取到了上下文的环境

public MainViewModle(@NonNull Application application) {
    super(application);
    this.context = application;

}

我们将布局交给databingding进行管理,首先开启modul开启databingding

android {
  .....
  //这样开启引用也可以dataBinding.enabled = true
    dataBinding{
        enabled = true
    }
}

首先我们要将布局全部都交给databingding进行管理

<?xml version="1.0" encoding="utf-8"?>
//layout 不是布局,是databingding所有的,用于将整个布局交给databingding进行管理
<layout xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="vm"
            type="com.lnh.jetpackmvvm.MainViewModle" />

     
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@mipmap/beijing"
        android:orientation="vertical"
        tools:context=".MainActivity">

        
.....
//你自己的逻辑
.....

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="10dp"
                        android:text="@{vm.phoneInfo}"
                        android:textColor="#333333"
                        android:textSize="32sp" />

.....
//你自己的逻辑
.....
                      <Button
                            android:id="@+id/bt_number4"
                                android:layout_width="match_parent"
                                android:layout_height="60dp"
                                android:layout_weight="1"
                                android:background="@drawable/key_background"
                                android:onClick="@{()->vm.InPutNumber(@string/number4)}"
                                android:text="4"
                                android:textColor="#ffffff"
                                android:textSize="22sp" />

                          
     .....
//你自己的逻辑
.....
    </LinearLayout>

</layout>

注意要添加否则找不到指向

<data>

        <variable
            name="vm"
            type="com.lnh.jetpackmvvm.MainViewModle" />

     
</data>

布局交由了databinding进行管理了,数据的操作的逻辑也全部交给了viewmodle进行了操作,那我们如何进行关联让他们进行双向驱动展示呢

1.我们要在view中找到我们做需要的管理

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

2.引用到我们数据的viewmodle

MainViewModle mainViewModle = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MainViewModle.class);

3.建立联系和感应

binding.setVm(mainViewModle);
//建立感应
binding.setLifecycleOwner(this);