android MVVM开发模式(五)
上一讲我们说了@InverseBindingAdapter标记的事情。通过这个,我们可以实现view向数据方向的传递。从而实现真正的双向绑定。
已经讲了这么多,核心的知识点基本完成,要每个细节去说,估计十几节讲不完了,因此我们再来看下一个核心内容,结束本系列教程。如果使用中有任何疑问,欢迎沟通交流。
我们前面讲过,@BindingAdapter 实现的函数必须是静态的。那它不能是非静态的吗?答案是可以的。
这个需求的出现是因为 我们有时会想在两种情况下,一个属性出现两种表现逻辑代码,这个主要的需求便是 正常流程 和测试模式,测试下可以模拟一条线路,不必走我们正常流程下的数据,可以直接提供测试数据,来测试代码。
当然,如果我们使用一个属性,来改变界面颜色搭配。那么实现两个同一属性的方法,配置不同的颜色,通过设置使用哪个代码,可以达到换肤的效果啦。
我们看下怎么操作的。
移除掉User里面的@BindingAdapter @InverseBindingAdapter 的方法,原因是我们要给这个属性使用两组实现。
1 实现一个抽象类。
- 这里有个问题,本来按照我们的理解,@InverseBindingAdapter注解的函数方法,应该也是可以非静态的(我们想使用测试时候反馈和正常反馈有些差异,然而当前data-binding不允许这个为非静态~~~~。这个我看了生成代码,是完全可以做到为非静态的,所以不解为什么系统当前不支持。)
- 我们定义了两个抽象的属性适配,没有实现代码。
2 我们实现它
3 实现DataBindingComponent接口
- 在我们做了上面的动作,具体指的是@BindingAdapter实现的方法是非静态的时候,那么我们肯定需要一个对应实例的吧。因此data-binding帮你将你需要写的方法生成了一个接口,让你去实现它就行了。(很智能化吧。)
- 我们实现它,返回一个适配器就可以了。在这里我们就可以清晰地看到,这个返回的我们可以定制的。如果我们多个继承了BaseAdapter类,比如
OptionAdapter 和OptionAdapter2 ,我们这里可以再写一个组件,返回OptionAdapter2,在我们的代码里面依据情况使用不同的组件。
4 使用它
- 这里关键点,最后一个参数。将我们的组件实例传递给它。这样子生成的绑定里面,才能依据这个找到真正实现属性对应方法的实例,然后调用。
- 我们可以看到绑定的实现里面,做了这个动作。
- mBindingComponent 是我们传递进来的,这里使用它的getBaseAdapter后再调用方法了。 所以我们通过传递不同的BindingComponent ,来实现同一属性多个实现方法了。
5 代码地址
https://github.com/luxiaoming/MVVMDemo