色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

harmonyos開發者平臺

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-05-06 16:02 ? 次閱讀

介紹

使用@State、@Prop、@Link、@Watch、@Provide、@Consume管理頁面級變量的狀態,實現對頁面數據的增加、刪除、修改。要求完成以下功能:

  1. 實現一個自定義彈窗,完成添加子目標的功能。
  2. 實現一個可編輯列表,可點擊指定行展開調節工作目標進度,可多選、全選刪除指定行。

相關概念

  • [頁面狀態管理]:用于管理頁面級變量的狀態。
  • [自定義彈窗]: 通過CustomDialogController類顯示自定義彈窗。
  • [List列表]:列表包含一系列相同寬度的列表項。

環境搭建

軟件要求

  • [DevEco Studio]版本:DevEco Studio 3.1 Release。
  • OpenHarmony SDK版本:API version 9。

硬件要求

  • 開發板類型:[潤和RK3568開發板]。
  • OpenHarmony系統:3.2 Release。

環境搭建

完成本篇Codelab我們首先要完成開發環境的搭建,本示例以RK3568開發板為例,參照以下步驟進行:

  1. [獲取OpenHarmony系統版本]:標準系統解決方案(二進制)。以3.2 Release版本為例:
  2. 搭建燒錄環境。
    1. [完成DevEco Device Tool的安裝]
    2. [完成RK3568開發板的燒錄]
  3. 搭建開發環境。
    1. 開始前請參考[工具準備],完成DevEco Studio的安裝和開發環境配置。
    2. 開發環境配置完成后,請參考[使用工程向導]創建工程(模板選擇“Empty Ability”)。
    3. 工程創建完成后,選擇使用[真機進行調測]。
    4. 鴻蒙開發指導文檔:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

代碼結構解讀

本篇Codelab只對核心代碼進行講解,對于完整代碼,我們會在gitee中提供。

├──entry/src/main/ets                   // ArkTS代碼區
│  ├──common
│  │  ├──constants
│  │  │  └──CommonConstants.ets         // 公共常量類
│  │  └──utils
│  │     ├──DateUtil.ets                // 獲取格式化日期工具
│  │     └──Logger.ets                  // 日志打印工具類
│  ├──entryability
│  │  └──EntryAbility.ts                // 程序入口類
│  ├──pages
│  │  └──MainPage.ets                   // 主頁面
│  ├──view
│  │  ├──TargetInformation.ets          // 整體目標詳情自定義組件
│  │  ├──AddTargetDialog.ets            // 自定義彈窗
│  │  ├──ProgressEditPanel.ets          // 進展調節自定義組件
│  │  ├──TargetList.ets                 // 工作目標列表
│  │  └──TargetListItem.ets             // 工作目標列表子項
│  └──viewmodel
│     ├──DataModel.ets                  // 工作目標數據操作類
│     └──TaskItemViewModel.ets          // 任務進展實體類
└──entry/src/main/resources             // 資源文件目錄

`HarmonyOSOpenHarmony鴻蒙文檔籽料:mau123789v直接拿`

搜狗高速瀏覽器截圖20240326151450.png

構建主界面

MainPage作為本應用的主界面,從上至下由三個自定義組件組成。

  1. 標題titleBar。
  2. 目標整體進展詳情TargetInformation。
  3. 子目標列表TargetList。

MainPage主要維護五個參數:子目標數組targetData、子目標總數totalTasksNumber、已完成子目標數completedTasksNumber、最近更新時間latestUpdateDate、監聽數據變化的參數overAllProgressChanged。具體作用有以下三個方面:

  1. 子組件TargetInformation接收三個參數totalTasksNumber、completedTasksNumber、latestUpdateDate,渲染整體目標詳情。
  2. 子組件TargetList接收參數targetData渲染列表。
  3. 使用@Watch監聽overAllProgressChanged的變化。當overAllProgressChanged改變時,回調onProgressChanged方法,刷新整體進展TargetInformation。
// MainPage.ets
@Entry
@Component
struct MainPage {
  // 子目標數組
  @State targetData: Array< TaskItemViewModel > = DataModel.getData();
  // 子目標總數
  @State totalTasksNumber: number = 0;
  // 已完成子目標數
  @State completedTasksNumber: number = 0;
  // 最近更新時間
  @State latestUpdateDate: string = CommonConstants.DEFAULT_PROGRESS_VALUE;
  // 監聽數據變化的參數
  @Provide @Watch('onProgressChanged') overAllProgressChanged: boolean = false;	
  ...

  /**
   * overAllProgressChanged改變時的回調
   */
  onProgressChanged() {
    this.totalTasksNumber = this.targetData.length;
    this.completedTasksNumber = this.targetData.filter((item) = > {
      return item.progressValue === CommonConstants.SLIDER_MAX_VALUE;
    }).length;
    this.latestUpdateDate = getCurrentTime();
  }

  build() {
    Column() {
      // 標題
      this.titleBar()
      // 目標整體進展詳情
      TargetInformation({
        latestUpdateDate: this.latestUpdateDate,
        totalTasksNumber: this.totalTasksNumber,
        completedTasksNumber: this.completedTasksNumber
      })
      // 子目標列表
      TargetList({
        targetData: $targetData,
        onAddClick: () :void  = > this.dialogController.open()
      })
        ...
    }
    ...
  }

  @Builder
  titleBar() {
    Text($r('app.string.title'))
      ...
  }
}

添加任務子目標

本章節主要介紹如何實現一個自定義彈窗,完成添加子目標的功能。效果如圖所示:

在MainPage.ets中,創建dialogController對象控制彈窗隱顯,傳入自定義組件AddTargetDialog和點擊確定的回調方法saveTask。

// MainPage.ets
@Entry
@Component
struct MainPage {
  dialogController: CustomDialogController = new CustomDialogController({
    builder: AddTargetDialog({
      onClickOk: (value: string): void = > this.saveTask(value)
    }),
    alignment: DialogAlignment.Bottom,
    offset: {
      dx: CommonConstants.DIALOG_OFFSET_X,
      dy: $r('app.float.dialog_offset_y')
    },
    customStyle: true,
    autoCancel: false
  });
}

在AddTargetDialog.ets中,參數onClickOk為function類型,接收MainPage傳入的saveTask方法。點擊確定,調用onClickOk執行saveTask方法,關閉彈窗。

// AddTargetDialog .ets
@CustomDialog
export default struct AddTargetDialog {
  ...
  private controller?: CustomDialogController;
  onClickOk?: (value: string) = > void;

  build() {
    Column() {
      ...
      Text($r('app.string.add_task_dialog'))
      ...
      TextInput({ placeholder: $r('app.string.input_target_name')})
      ...
      .onChange((value: string) = > {
        this.subtaskName = value;
      })
      Blank()
      Row() {
        ...
        Button($r('app.string.confirm_button'))
          .dialogButtonStyle()
          .onClick(() = > {
            if (this.onClickOk !== undefined) {
              this.onClickOk(this.subtaskName);
            }
          })
      }
      ...
    }
    ...
  }
}

在MainPage.ets中,實現saveTask方法:保存數據至DataModel中,并更新targetData的值,完成添加子目標功能。

// MainPage.ets
saveTask(taskName: string) {
  if (taskName === '') {
    promptAction.showToast({
      message: $r('app.string.cannot_input_empty'),
      duration: CommonConstants.TOAST_TIME,
      bottom: CommonConstants.TOAST_MARGIN_BOTTOM
    });
    return;
  }
  DataModel.addData(new TaskItemViewModel(taskName, 0, getCurrentTime()));
  this.targetData = DataModel.getData();
  this.overAllProgressChanged = !this.overAllProgressChanged;
  this.dialogController.close();
}

實現可編輯列表

本章節主要介紹子目標列表TargetList的實現,包括以下功能:

  • 列表項展開。
  • 列表子項點擊下拉,滑動滑塊更新進展。
  • 列表進入編輯狀態,單選、多選、全選、刪除子項。

實現列表項展開

實現以下步驟完成點擊列表項展開功能:

  1. 使用@State 管理參數isExpanded,表示當前項是否展開,具體表現為自定義組件ProgressEditPanel的顯示或隱藏。
  2. 使用@Link和@Watch管理參數clickIndex,表示當前點擊ListItem的Index索引。clickIndex值的改變將會傳遞至所有的ListItem。
  3. 完成onClick點擊事件,將isExpanded 值置反,修改clickIndex值為當前點擊的索引。
// TargetListItem.ets
@Component
export default struct TargetListItem {
  @State latestProgress?: number = 0;
  @Link @Watch('onClickIndexChanged') clickIndex: number;
  @State isExpanded: boolean = false;
  ...
  // clickIndex改變的回調方法
  onClickIndexChanged() {
    if (this.clickIndex !== this.index) {
      this.isExpanded = false;
    }
}

  build() {
    ...
    Column() {
      this.TargetItem()
      if (this.isExpanded) {
        Blank()
        // 自定義組件:編輯面板
        ProgressEditPanel({
          slidingProgress: this.latestProgress,
          onCancel: () = > this.isExpanded = false,
          onClickOK: (progress: number): void = > {
              this.latestProgress = progress;
              this.updateDate = getCurrentTime();
              let result = DataModel.updateProgress(this.index, this.latestProgress, this.updateDate);
              if (result) {
                this.overAllProgressChanged = !this.overAllProgressChanged;
              }
              this.isExpanded = false;
            },
          sliderMode: $sliderMode
        })
        ...
      }  
    }
    ...
    .onClick(() = > {
      ...
      if (!this.isEditMode) {
        animateTo({ duration: CommonConstants.DURATION }, () = > {
          this.isExpanded = !this.isExpanded;
        })
        this.clickIndex = this.index;
      }
    })
  }
  ...
}

實現更新進展

列表某項被展開后,實現以下步驟完成更新進展功能:

  1. Slider實現滑動條,滑動滑塊調節進展,使用slidingProgress保存滑動值。
  2. 點擊確定調用onClickOK方法,將數據slidingProgress回調至TargetListItem。
  3. 在TargetListItem中獲取回調的數據并刷新頁面。
// ProgressEditPanel.ets
@Component
export default struct ProgressEditPanel {
  @Link sliderMode: number;
  @Prop slidingProgress: number = 0;
  onCancel?: () = > void;
  onClickOK?: (progress: number) = > void;

  build() {
    Column() {
      Slider({...})
      Row() {
        CustomButton({
          buttonText: $r('app.string.cancel_button')
        })
          .onClick(() = > {
            if (this.onCancel !== undefined) {
              this.onCancel();
            }
          })
       CustomButton({
          buttonText: $r('app.string.cancel_button')
       })
          .onClick(() = > {
            if (this.onClickOK !== undefined) {
              this.onClickOK(this.slidingProgress);
            }
          })
      }
    }
  }
}

在DataModel.ets中,編寫updateProgress方法。該方法根據索引和進度值以及更新日期更新數據。

// DataModel.ets
updateProgress(index: number, updateValue: number, updateDate: string): boolean {
  if (!this.targetData[index]) {
    return false;
  }
  this.targetData[index].progressValue = updateValue;
  this.targetData[index].updateDate = updateDate;
  return true;
}

實現列表多選

列表進入編輯模式才可單選、多選。實現以下步驟完成列表多選功能:

  1. 維護一個boolean類型的數組selectArray,其長度始終與數據列表的長度相等,且初始值均為false。表示進入編輯狀態時列表均未選中。
  2. 定義一個boolean類型的值isEditMode,表示是否進入了編輯模式。
  3. TargetListItem選中狀態的初始化和點擊Checkbox改變TargetListItem的選中狀態。
// TargetList.ets
export default struct TargetList {
  ...
  @State isEditMode: boolean = false;
  @State selectArray: Array< boolean > = [];
  ...

  build() {
    Column() {
      ...
      if (this.isEditMode) {
        // 取消按鈕
        Text($r('app.string.cancel_button'))
          ...
          .onClick(() = > {
             this.selectAll = false;
             this.isEditMode = false;
             this.selectAllOrCancel(false);
          })
        ...
        // 全選按鈕
        Checkbox()
          ...
          .onClick(() = > {
            ...
            this.selectAllOrCancel(this.selectAll);
          })
      } else {
        // 編輯按鈕
        Text($r('app.string.edit_button'))
          ...
          .onClick(() = > {
            this.isEditMode = true;
            this.selectAllOrCancel(false);
          })
      }
      ...
    }
  }
}

點擊全選Checkbox,將selectArray數組的值全賦值true或false,重新渲染列表為全選或者取消全選狀態。

// TargetList.ets
selectAllOrCancel(selectStatus: boolean) {
  let newSelectArray: Array< boolean > = [];
  this.targetData.forEach(() = > {
    newSelectArray.push(selectStatus);
  });
  this.selectArray = newSelectArray;
}

在TargetListItem中,實現以下步驟改變ListItem的選中狀態:

  1. 使用@Link定義selectArr數組接收TargetList傳入的selectArray。
  2. 在TargetListItem渲染時,使用this.selectArr[this.index]獲取初始選中狀態。
  3. 點擊Checkbox時,按照當前ListItem的索引,將選中狀態保存至selectArr,重新渲染列表完成單選和多選功能。
// TargetListItem.ets
export default struct TargetListItem {

  ...
  @Link selectArr: Array< boolean >;
  public index: number = 0;
  
  build() {
    Stack({ alignContent: Alignment.Start }) {
      ...
      this.TargetItem()
      ...
      Checkbox()
        // 獲取初始選中狀態
        .select(this.selectArr[this.index])
        ...
        .onChange((isCheck: boolean) = > {
          // 改變被點擊項的選中狀態
          this.selectArr[this.index] = isCheck;
        })
      ...
    ...
    }
  }
}

實現刪除選中列表項

當點擊“刪除”時,TargetList.ets的deleteSelected方法,實現以下步驟完成列表項刪除功能:

  1. 調用DataModel的deleteData方法刪除數據。
  2. 更新targetData的數據重新渲染列表。
  3. 修改overAllProgressChanged的值,通知主頁刷新整體進展詳情TargetInformation。
// TargetList.ets
deleteSelected() {
  DataModel.deleteData(this.selectArray);
  this.targetData = DataModel.getData();
  this.overAllProgressChanged = !this.overAllProgressChanged;
  this.isEditMode = false;
}

在DataModel.ets中,遍歷數據列表,刪除被選中的數據項。

// DataModel.ets
export class DataModel {
  ...
  deleteData(selectArr: Array< boolean >) {
    if (!selectArr) {
      Logger.error(TAG, 'Failed to delete data because selectArr is ' + selectArr);
    }
    let dataLen = this.targetData.length - CommonConstants.ONE_TASK;
    for (let i = dataLen; i >= 0; i--) {
      if (selectArr[i]) {
        this.targetData.splice(i, CommonConstants.ONE_TASK);
      }
    }
  }
  getData(): Array< TaskItemViewModel > {
    return this.targetData;
  }
  ...
}

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 開發者
    +關注

    關注

    1

    文章

    563

    瀏覽量

    17005
  • 鴻蒙
    +關注

    關注

    57

    文章

    2339

    瀏覽量

    42805
  • OpenHarmony
    +關注

    關注

    25

    文章

    3713

    瀏覽量

    16254
  • RK3568
    +關注

    關注

    4

    文章

    514

    瀏覽量

    5034
收藏 人收藏

    評論

    相關推薦

    HarmonyOS】應用開發10-HarmonyOS開發者平臺和工具發布 - HDC2020

    發表于 11-05 18:16

    【官方資料】HDC技術論壇PPT分享-HarmonyOS應用開發專場

    HarmonyOS】應用開發10-HarmonyOS開發者平臺和工具發布 - HDC2020https://bbs.elecfans.co
    發表于 11-05 18:29

    【原創】IPC DIY攝像頭上手1

    存儲器接口TF卡最大支持128GB(通用FAT32格式)WLAN協議支持 802.11 b/g/n[td][/td][td]三、開發資料HarmonyOS 開發者平臺有設備和應用的快速
    發表于 01-10 10:13

    HDD | HarmonyOS開發者日 上海站

    -------------------------------------------------------------------------------------HarmonyOS開發者日是華為為HarmonyOS的廣大
    發表于 04-01 15:55

    HarmonyOS開發者

    HarmonyOS開發者HarmonyOS設備開發學習路線HarmonyOS 2.0如約而至,內存在128KB~128MB的終端設備廠商有
    發表于 07-22 09:53

    絕對干貨!HarmonyOS開發者日資料全公開,鴻蒙開發者都在看

    731HarmonyOS開發者日大會PPT資料全在這了,想要了解的小伙伴可以自行下載啦~下載資料的小伙伴還可以在評論區回復領取5個積分哦1、HarmonyOS 職業認證解讀:該主題是開發者
    發表于 08-04 14:36

    請問海外開發者如何開發HarmonyOS應用?

    海外開發者如何開發HarmonyOS應用?
    發表于 06-02 15:50

    喜報|HarmonyOS開發者社區連獲業內獎項,持續深耕開發者生態

    臨近年末,各大平臺陸續揭曉年度榜單,表彰了具備強大影響力與做出突出貢獻的優秀項目與團隊,而HarmonyOS開發者社區作為技術分享,學習和展示的平臺,輸出高質量技術文章百余篇,連續獲得
    發表于 01-19 14:32

    華為開發者HarmonyOS零基礎入門:四步實現HarmonyOS應用

    華為開發者HarmonyOS零基礎入門:四步實現HarmonyOS應用,可以自定義主鍵實際應用在開發者界面。
    的頭像 發表于 10-23 10:05 ?1944次閱讀
    華為<b class='flag-5'>開發者</b><b class='flag-5'>HarmonyOS</b>零基礎入門:四步實現<b class='flag-5'>HarmonyOS</b>應用

    華為開發者大會2021 HarmonyOS 3開發者預覽版

    華為開發者大會2021上,隨著全新的 HarmonyOS 3 開發者預覽版發布,HarmonyOS 應用與服務開發工具套件全家桶也全面升級,
    的頭像 發表于 10-23 11:20 ?1351次閱讀
    華為<b class='flag-5'>開發者</b>大會2021 <b class='flag-5'>HarmonyOS</b> 3<b class='flag-5'>開發者</b>預覽版

    華為開發者分論壇HarmonyOS學生公開課-10分鐘成為HarmonyOS開發者

    2021華為開發者分論壇HarmonyOS學生公開課-10分鐘成為HarmonyOS開發者
    的頭像 發表于 10-24 11:03 ?1922次閱讀
    華為<b class='flag-5'>開發者</b>分論壇<b class='flag-5'>HarmonyOS</b>學生公開課-10分鐘成為<b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發者</b>

    華為開發者分論壇HarmonyOS學生公開課-如何學習HarmonyOS應用開發

    2021華為開發者分論壇HarmonyOS學生公開課-如何學習HarmonyOS應用開發
    的頭像 發表于 10-24 11:09 ?2131次閱讀
    華為<b class='flag-5'>開發者</b>分論壇<b class='flag-5'>HarmonyOS</b>學生公開課-如何學習<b class='flag-5'>HarmonyOS</b>應用<b class='flag-5'>開發</b>?

    2021華為開發者大會HarmonyOS學生公開課上教你10分鐘成為HarmonyOS開發者

    2021華為開發者大會HarmonyOS學生公開課上教你10分鐘成為HarmonyOS開發者 學習HarmonyOS應用
    的頭像 發表于 10-24 11:03 ?2128次閱讀
    2021華為<b class='flag-5'>開發者</b>大會<b class='flag-5'>HarmonyOS</b>學生公開課上教你10分鐘成為<b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發者</b>

    華為開發者分論壇HarmonyOS學生公開課-開發者成長圖譜

    2021華為開發者分論壇HarmonyOS學生公開課-開發者成長圖譜
    的頭像 發表于 10-24 11:25 ?1970次閱讀
    華為<b class='flag-5'>開發者</b>分論壇<b class='flag-5'>HarmonyOS</b>學生公開課-<b class='flag-5'>開發者</b>成長圖譜

    面向HarmonyOS開發者HarmonyOS 3.0 Beta介紹

    2021年10月,我們面向開發者發布了HarmonyOS 3.0 Developer Preview版,但開發的腳步永不停歇,現在我們又更新了API版本,配套發布了HarmonyOS
    的頭像 發表于 07-06 20:34 ?3296次閱讀
    主站蜘蛛池模板: 欧美18videosex初次| 国产精品久久大陆| 一本之道加勒比在线观看| 我的美女奴隶| 十分钟视频影院免费| 日韩一级精品久久久久| 飘雪在线观看免费高清完整版韩国| 久久久无码精品亚洲日韩按摩| 高H纯肉NP 弄潮NP男男| couo福利姬图库| 91看片淫黄大片.在线天堂| 中文字幕AV在线一二三区| 伊人久久国产| 在线观看亚洲AV无码每日更新| 亚洲中文在线偷拍| 一品道门免费视频韩国| 亚洲在线无码免费观看| 一边啪啪的一边呻吟声口述| 一个人的HD高清在线观看 | 久久99视热频国只有精品| 国内精品偷拍在线观看| 国内精品乱码卡一卡2卡三卡| 国产精品久人妻精品| 国产 高清 无码 在线播放| 国产91综合| 国产一浮力影院| 精品高清国产a毛片| 久久热在线视频精品店| 蜜桃99影院| 日韩成人在线视频| 亚洲 视频 在线 国产 精品| 亚洲日韩视频免费观看| 在线观看国产小视频| 99久久久无码国产精品不卡按摩 | 亚洲精品成人a在线观看| 亚洲日本天堂在线| 91热久久免费精品99| xxx性欧美在线| 国产露脸150部国语对白| 九色PORNY真实丨国产免费| 门鱼电影完整版免费版|