HarmonyOS DataBinding 使用指南
在开始讲DataBinding之前,我们不得不先说一下MVVM架构模式,MVVM是MVP模式的改进版,Model层跟View层与MVP模式类似,ViewModel层只做和逻辑处理相关的工作,在ViewModel中不会持有View层的引用,这时候就需要借助DataBinding,通过Binding方式通信,只需要在ViewModel层对数据进行操作,View层就会自动更新UI。
概述
Databinding 顾名思义就是数据绑定,HarmonyOS为提供了Databinding库,该库允许你使用声明格式而不是以代码的方式将数据绑定到UI上。Databinding库会解析布局文件,自动生成数据绑定代码,实现数据源与UI组件之间的相互绑定。
自动生成绑定代码的基类,是用来实现ComponentContainer和ActiveData对象之间的绑定,ComponentContainer是指组件容器,相当于Android的ViewGroup,ActiveData是一个可观察数据类,同时也具有生命周期感知,作用类似于Android的LiveData。
当ComponentContainer或ActiveData对象被修改时,DataBinding对象会自动修改绑定到ComponentContainer或ActiveData的对象。比如,如果你修改了某个ComponentContainer的属性,DataBinding会将属性值到绑定到该ComponentContainer的ActiveData对象。反之亦然,如果一个ActiveData对象的属性值被更改,绑定的ComponentContainer的属性值也将被更新。
开始使用
1.在使用DataBinding之前,首先要在应用模块下build.gradle中开启dataBinding,代码如下:
- ohos {
- ...
- buildTypes {
- debug {
- dataBindingEnabled true
- }
- }
- }
2.使用DataBinding之前,首先使用ActiveData对象来定义要观察的数据,并实现其0get() 和set()方法:
创建一个Model类
- public class MainAbilityModel {
- private ActiveData titile;
- public ActiveData getTitile() {
- return titile;
- }
- public void setTitile(ActiveData titile) {
- this.titile = titile;
- }
- }
3.在我们的布局文件中,声明DataBinding的绑定标签
- <?xml version="1.0" encoding="utf-8"?>
- <DirectionalLayout
- xmlns:ohos="http://schemas.huawei.com/res/ohos"
- ohos:height="match_parent"
- ohos:width="match_parent"
- ohos:background_element="#1a1a1a"
- ohos:orientation="vertical">
- <Text
- ohos:id="$+id:title_text"
- ohos:height="300"
- ohos:width="match_parent"
- ohos:text="${model.titile}"
- ohos:text_alignment="center"
- ohos:text_color="#FF555555"
- ohos:text_size="50"/>
- <....>
- <binddata>
- <variable
- class="com.example.time.model.MainAbilityModel"
- name="model"/>
- </binddata>
- </DirectionalLayout>
在<Text>
4.在布局中声明DataBinding后,系统会在编译后自动生成一个以布局文件命名的Binding类,比如我的布局文件名为ability_main,那么系统就会自动生成一个AbilityMainBinding类。我们在Slice类中调用DataBindingUtil.createBinding方法来获取AbilityMainBinding的对象,然后调用initComponent及setLifecycle来初始化对象,之后我们就可以调用在ActiveData对象设置数据,调用MainAbilityModel中定义的方法,绑定到其中的ActiveData对象。
- public class MainAbilitySlice extends AbilitySlice {
- private static HiLogLabel mLabel = new HiLogLabel(HiLog.LOG_APP, 00001, "suisui");
- AbilityMainBinding binding;
- @Override
- public void onStart(Intent intent) {
- super.onStart(intent);
- ComponentContainer componentContainer =
- (ComponentContainer) LayoutScatter.getInstance(this).parse(ResourceTable.Layout_ability_main, null, false);
- if (!(componentContainer instanceof ComponentContainer)) {
- return;
- }
- super.setUIContent(componentContainer);
- try {
- binding = DataBindingUtil.createBinding(ResourceTable.Layout_ability_main, getContext(), "com.example.time");
- } catch (IllegalArgumentException | IOException exception) {
- HiLog.info(mLabel, exception.toString());
- }
- if (binding != null) {
- binding.initComponent(componentContainer);
- binding.setLifecycle(getLifecycle());
- ActiveData price = new ActiveData<>();
- price.setData("DataBinding Demo");
- MainAbilityModel model = new MainAbilityModel();
- model.setTitile(price);
- binding.setModel(model);
- }
- }
- }
需要注意的是在调用DataBindingUtil.createBinding时,要替换成自己的包名。
至此,我们大致的把DataBinding的简单使用梳理了,总体来说DataBinding可以为我们减少代码量,也不需要再做findComponentById,设置数据等一些繁琐的操作。但在实际业务开发当中可能也会有一定的局限性,例如ActiveData的类型转换问题,相信后续官方也会越来越完善,HarmonyOS也会越来越好,让我们拭目以待。
最终效果
![【中软国际】HarmonyOS DataBinding 使用指南-鸿蒙HarmonyOS技术社区](https://s3.51cto.com/oss/202107/26/27305500ea5629d20045ba53ea902191.jpg)
注:DevEco Studio版本过低可能会导致编译生成Binding找不到包,可升级版本再试。
相关文章
- 数据孤岛是业务效率的无声杀手
- 2023展望:新的一年将给大数据分析领域带来什么?
- 阿里云ADB基于Hudi构建Lakehouse的实践
- 大数据在医疗保健领域的使用案例
- 微软增加说明:KB5021751 更新扫描已经 / 即将过时 Office 过程中不会触碰用户隐私
- 2022 Gartner全球云数据库管理系统魔力象限发布 腾讯云数据库入选
- 场景化、重实操,分享一个实时数仓实践案例
- Arctic的湖仓一体践行之路
- 分布式计算MapReduce究竟是怎么一回事?
- 淘系数据模型治理优秀实践
- 大数据分析对医疗保健的影响
- 当我们说大数据Hadoop,究竟在说什么?
- 2022年及以后大数据的五个发展趋势
- 网易严选离线数仓治理实践
- 2023 年数据治理趋势
- 一份“靠谱”的年度经营计划,你学会了吗?
- 漫谈对大数据的思考
- 测试一下,读懂数据的能力,你有吗?
- 用艺术的眼光探索数据之美
- 聊聊数据分析成果如何落地