【中软国际】HarmonyOS DataBinding 使用指南 原创 精华

中软小助手
发布于 2021-7-22 11:24
浏览
7收藏

​ 在开始讲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的绑定标签<binddata>,并在<variable>中定义刚创建的ActiveData Model类。

<?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>的ohos:text属性,进行数据绑定ohos:text=“${model.titile}”

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 使用指南-鸿蒙开发者社区

注:DevEco Studio版本过低可能会导致编译生成Binding找不到包,可升级版本再试。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2021-7-22 11:24:28修改
18
收藏 7
回复
举报
8条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

期待后续官方继续完善。

回复
2021-7-22 14:02:58
没用的喵叔
没用的喵叔

这两天在看 Codelab:元数据绑定框架  

它和数据绑定有什么区别呢?貌似功能上差不多。

 

------

刚刚体验一下,大家可以直接clone代码:

https://gitee.com/andych008/test-data-binding

已于2021-7-22 15:39:47修改
2
回复
2021-7-22 14:15:59
chaoxiaoshu
chaoxiaoshu

感谢分享!

很有学习价值,先收藏了,改天抽空研究

回复
2021-7-22 14:44:15
中软小助手
中软小助手 回复了 没用的喵叔
这两天在看 Codelab:元数据绑定框架 它和数据绑定有什么区别呢?貌似功能上差不多。 ------ 刚刚体验一下,大家可以直接clone代码: https://gitee.com/andych008/test-data-binding

元数据绑定的话,主要还是需要通过json先定义数据模型。我个人理解 感觉比较偏向于本地数据的绑定,相对来说比较繁琐。

回复
2021-7-22 17:22:14
chaoxiaoshu
chaoxiaoshu

请问我增加或删除组件后,如何让DevEco自动更新AbilityMainBinding呢

回复
2021-7-28 20:23:46
XFJingGG
XFJingGG

非常好的分享,学习了

回复
2021-8-2 09:39:28
高建明108
高建明108 回复了 chaoxiaoshu
请问我增加或删除组件后,如何让DevEco自动更新AbilityMainBinding呢

先clean,再重新build run即可

回复
2021-8-20 14:59:27
裴云飞1
裴云飞1 回复了 中软小助手
元数据绑定的话,主要还是需要通过json先定义数据模型。我个人理解 感觉比较偏向于本地数据的绑定,相对来说比较繁琐。

两者的区别就是数据绑定提供的功能有限,元数据绑定实际上是对数据绑定的功能补充。

回复
2021-8-29 14:51:18
回复