Saber

项目地址:simplezhli/Saber 

简介:? 帮助你快速使用 Android 的 LiveData 与 ViewModel

更多:作者   提 Bug   

标签:

 

  

本项目帮助你快速使用 LiveData 与 ViewModel

  • 已适配 AndroidX。

  • 支持 Kotlin。

  • 支持 ViewModelAndroidViewModel。(默认为 ViewModel

  • 支持 observeobserveForever 两种观察模式。(默认为 observe

  • 支持 SingleLiveEventMediatorLiveDataMutableLiveData。(默认为 MutableLiveData

  • 支持自定义LiveData类型。

  • 支持事件总线的操作。

  • Forever 模式自动取消订阅。

详细介绍

  • 感受 LiveData 与 ViewModel 结合之美

使用方式

添加依赖

    implementation 'com.github.simplezhli.saber:saber-api:0.2.4'    //AndroidX 使用    implementation 'com.github.simplezhli.saber:saberx-api:0.2.4'    annotationProcessor 'com.github.simplezhli.saber:saber-compiler:0.2.4'

首先创建一个类,使用@LiveData注解标记你要保存的数据。注意这里的参数名称 value,下面会用到。

public class SeekBar {    @LiveData    Integer value;}

当然也可以直接标记你的 JavaBean,来直接保存此类。那么参数名为类名的首字母小写:seekBar

@LiveDatapublic class SeekBar {    Integer value;}

使用@LiveData(classType = LiveDataClassType.LIST)可以指定对应的数据集合类型

Build -- > Make Project 会生成代码如下:

public class SeekBarViewModel extends ViewModel {  private MutableLiveData mValue;  public MutableLiveData getValue() {    if (mValue == null) {      mValue = new MutableLiveData<>();    }    return mValue;  }  public Integer getValueValue() {    return getValue().getValue();  }  public void setValue(Integer mValue) {    if (this.mValue == null) {      return;    }    this.mValue.setValue(mValue);  }  public void postValue(Integer mValue) {    if (this.mValue == null) {      return;    }    this.mValue.postValue(mValue);  }}

如果想使用AndroidViewModel的话,可以添加@AndroidViewModel注解

@AndroidViewModelpublic class SeekBar {    @LiveData    Integer value;}

自定义LiveData类型

public class Single {    @LiveData(type = LiveDataType.OTHER, liveDataType = XXXLiveData.class)    Integer value;}

生成代码提供了 LiveData 的常用操作。

  • setXXX()要在主线程中调用。

  • postXXX()既可在主线程也可在子线程中调用。

  • getXXX()用于获取观察者。

  • getXXXValue()可以获取保存的数据。

  • addSource()用于监听 LiveData。(MediatorLiveData 专用)

  • removeSource()移除监听的 LiveData。(MediatorLiveData 专用)

1. 普通使用方法

一般情况下可以直接使用它。比如:

public class TestFragment extends Fragment {    private SeekBar mSeekBar;    @BindViewModel(isShare = true) //<--标记需要绑定的 ViewModel    SeekBarViewModel mSeekBarViewModel;    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {        // Inflate the layout for this fragment        View root = inflater.inflate(R.layout.fragment_test, container, false);        mSeekBar = root.findViewById(R.id.seekBar);        Saber.bind(this); // <--这里绑定 ViewModel        subscribeSeekBar();        return root;    }    private void subscribeSeekBar() {        mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {            @Override            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {                if (fromUser) {                    mSeekBarViewModel.setValue(progress);                }            }            ......        });    }    @OnChange(model = "mSeekBarViewModel") //<--接收变化的 ViewModel 变量名    void setData(Integer value){ //注意这里使用 @LiveData 标记的参数名        if (value != null) {            mSeekBar.setProgress(value);        }    }}

@BindViewModel用于绑定 ViewModel。

@OnChange(model = "xxx")用于接收指定 ViewModel 的数据变化,可以不设置,默认 model 名称为 mViewModel。

如果需要Fragment之间数据共享,需要@BindViewModel(isShare = true),当然也要保证传入相同的 key 值。默认 key 值是类的规范名称,也就是包名加类名。

这里写图片描述

所以一旦需要互通的 Fragment 类名或包名不一致,就无法数据共享。这时可以指定 key 值:@BindViewModel(key = "value")

2. 事件总线使用方法,详细用法参看 LiveEventBus

    @OnChange(model = "key_name", isBus = true)    void liveDataBus(String value){    }

发送:

    LiveEventBus.get().with("key_name").postValue("value");

更多的使用方法可以参看本项目 demo。

3.Kotlin 环境使用注意事项

1.将以下代码添加到 build.gradle 文件中,保证生成代码的正确性。

    kapt {        correctErrorTypes = true    }

2.Kotlin 默认会生成 set/get 方法,并把属性设置为private 所以只要保证 Kotlin 中字段可见性不是private即可,简单解决可以在字段上添加 @JvmField,也可以使用lateinit.

    @BindViewModel    lateinit var mViewModel: TestViewModel    //或    @JvmField    @BindViewModel    var mViewModel: TestViewModel? = null

TODO

1.因为现有的@OnChange注解承载的功能过多,不易使用。后面会将EventBus功能从中提出,添加一个新的注解(或许叫做@LiveEventBus)。

2.有什么好的建议或者功能欢迎提 Issues。

版本变化

  • 点击查看

Thanks For

  • butterknife

  • 在 SnackBar,Navigation 和其他事件中使用 LiveData

  • LiveEventBus

更多相关文章

  1. Notification中Intent携带数据重复问题
  2. android中的数据存储
  3. ThreadLocal原理解析(1):数据存取
  4. Android--用JSON解析数据
  5. Android 中的数据存储
  6. android 直接进行数据库操作
  7. android数据的五种存储方式

随机推荐

  1. android 获取服务器文件流 hander
  2. Android:启动页有短暂白屏的解决方法
  3. Consider adding android:paddingStart=
  4. Android Activity生命週期简介
  5. Android学习博客和文章存档
  6. 接收短信启动相应服务
  7. 管道的私用,删除android的流氓
  8. android 修改videoview的宽度和高度
  9. Android7.0适配教程与心得
  10. android集成百度地图SDK 自定义keystore