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也會越來越好,讓我們拭目以待。
最終效果

注:DevEco Studio版本過低可能會導致編譯生成Binding找不到包,可升級版本再試。


























