当前位置: 首页 > article >正文

【时间盒子】-【13.任务新建】创建一个新任务

Tips:

@Watch、@Provide:对状态变量的监听。请参考我的帖子:https://developer.huawei.com/consumer/cn/forum/topic/0208152234389094513?fid=0101587866109860105

router:页面路由。请参考官方文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-router-0000001820880773#ZH-CN_TOPIC_0000001811317158__routerpushurl9

promptAction:创建并显示文本提示框。请参考官方文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-promptaction-V5#promptactionshowtoast

一、预览

回顾【6.任务页面】内容,Detail页面布局中遗留的todo 待完善的组件。本篇我们把已设计好的组件添加到该页面。

  1. 标题菜单栏
  2. 时间选择器
  3. 任务设置项

二、标题菜单栏

因为新增、修改都共用这个页面,所以标题文字需动态改变。我们定义一个属性变量isNew,判断是否新增,是则标题显示“新建任务”,否则显示“修改任务”。

另外,还需定义打勾按钮事件:保存任务。首先判断任务名称是否为空,是空则吐司toast提示;不为空时,才能保存。将任务保存到本地(数据持久化+后台代理提醒,见后续篇章),且保存成功后返回上一页面(任务列表页)。

定义一个数据工具类DataUtil,用来判断数据为NULL或空值。右击目录utils >> 新建 >> ArkTS File,文件命名为DataUtil。

定义一个判断是否为空的函数isNull,返回布尔值类型。DataUtil.ets文件代码如下:

/**
 * 数据工具类
 */
export default class DataUtil {
  /**
   * 判断对象是否为空
   */
  static isNull(obj: Object): Boolean {
    return (typeof obj === 'undefined' || obj === '' || obj == null);
  }
}

定义一个属性变量taskModel,用来缓存新建的任务实体。页面中的任务名称、任务时长对应实体对象taskModel的name属性和duration属性。并且,监听taskModel对象的变化,当发生变化时回调函数onTaskModelChangeHandler进行处理。Detail.ets文件代码如下:

import router from '@ohos.router'
import promptAction from '@ohos.promptAction'
import TitleContainer from '../component/TitleContainer'
import SizeUtil from '../utils/SizeUtil'
import DataUtil from '../utils/DataUtil'
import TaskModel from '../viewmodel/TaskModel'
@Entry
@Component
struct Detail {
  private isNew: boolean = true;
  @Watch('onTaskModelChangeHandler') @Provide taskModel: TaskModel = new TaskModel();
  build() {
    Column() {
      // 标题菜单栏
      TitleContainer({ title: this.isNew ? $r('app.string.new_task') : $r('app.string.update_task')
      , backImg: $r('app.media.icon_cancel')
      }) {
        Button() {
          Image($r('app.media.icon_confirm')).objectFit(ImageFit.Fill)
        }
        .width(SizeUtil.getVp($r('app.float.title_button_size')))
        .height(SizeUtil.getVp($r('app.float.title_button_size')))
        .backgroundColor("#00000000")
        .onClick(() => {
          if (!DataUtil.isNull(this.taskModel.name)) {
            // 保存任务,数据持久化+后台代理提醒
            // TODO: 待完善,见后续篇章
            router.back()
          } else {
            promptAction.showToast({
              message: '任务名不能为空!',
              duration: 2000
            })
          }
        })
      }

      // 时间选择器
      // TODO: 待完善

      // 任务设置项
      // TODO: 待完善

    }
    .width('100%')
    .height('100%')
    .backgroundColor($r('app.color.grey_light'))
  }
  /**
   * 任务数据改变时回调
   */
  onTaskModelChangeHandler() {
    // 监听taskModel对象的变化,并做相应处理
    // TODO: 待完善
  }

}

三、时间选择器

我们在【8.时间选择器】文章中有介绍时间选择器,把DateSelector组件添加到页面布局中,Detail.ets文件增加的代码如下:

import DateSelector from '../component/DateSelector'
// 时间选择器
DateSelector()

四、任务设置项

我们在【9.任务设置项】文章中有介绍任务设置项,把SettingList组件添加到页面布局中,且需要传入参数settingItems值,这个参数值就是任务设置项数组taskSettingItems,含两个对象:任务名称和任务时长。

并且,taskModel对象发生变化时,同时影响taskSettingItems;设置任务名称、任务时长,taskSettingItems发生改变,也影响taskModel对象的值。

我们定义一个方法initData(),初始化任务设置项。并且被监听taskModel变化的onTaskModelChangeHandler回调函数中调用。

Detail.ets文件完整的代码如下:

import router from '@ohos.router'
import promptAction from '@ohos.promptAction'
import TitleContainer from '../component/TitleContainer'
import SizeUtil from '../utils/SizeUtil'
import DataUtil from '../utils/DataUtil'
import TaskModel from '../viewmodel/TaskModel'
import DateSelector from '../component/DateSelector'
import SettingList from '../component/SettingList'
import TaskSettingItem from '../viewmodel/TaskSettingItem'
import { TaskSettingType } from '../constants/TaskSettingType'
@Entry
@Component
struct Detail {
  private isNew: boolean = true;
  @Watch('onTaskModelChangeHandler') @Provide taskModel: TaskModel = new TaskModel();
  // 任务设置项数组
  @State taskSettingItems: Array<TaskSettingItem> = [];
  build() {
    Column() {
      // 标题菜单栏
      TitleContainer({ title: this.isNew ? $r('app.string.new_task') : $r('app.string.update_task')
      , backImg: $r('app.media.icon_cancel')
      }) {
        Button() {
          Image($r('app.media.icon_confirm')).objectFit(ImageFit.Fill)
        }
        .width(SizeUtil.getVp($r('app.float.title_button_size')))
        .height(SizeUtil.getVp($r('app.float.title_button_size')))
        .backgroundColor("#00000000")
        .onClick(() => {
          if (!DataUtil.isNull(this.taskModel.name)) {
            // 保存任务,数据持久化+后台代理提醒
            // TODO: 待完善,见后续篇章
            router.back()
          } else {
            promptAction.showToast({
              message: '任务名不能为空!',
              duration: 2000
            })
          }
        })
      }

      // 时间选择器
      DateSelector()

      // 任务设置项
      SettingList({
        settingItems: $taskSettingItems
      })

    }
    .width('100%')
    .height('100%')
    .backgroundColor($r('app.color.grey_light'))
  }
  
  /**
   * 任务数据改变时回调
   */
  onTaskModelChangeHandler() {
    // 监听taskModel对象的变化,并做相应处理
    this.initData();
  }
  
  /**
   * 初始化数据
   */
  initData() {
    this.taskSettingItems = [
      new TaskSettingItem('任务名称', this.taskModel.name, TaskSettingType.TASK_NAME),
      new TaskSettingItem('任务时长', this.taskModel.duration + ' 分钟', TaskSettingType.TASK_DURATION)
    ];
  }

}

五、其他文件更新的内容

string.json文件

代码如下:

media目录

将附件icon_confirm.png添加到media目录中。

下一篇:任务修改


http://www.kler.cn/a/370736.html

相关文章:

  • Git在码云上的使用指南:从安装到推送远程仓库
  • 【AI学习】地平线首席架构师苏箐关于自动驾驶的演讲
  • 仿射密码实验——Python实现(完整解析版)
  • Git学习笔记
  • 【算法】枚举
  • JVM类加载器(附面试题)
  • 基于边缘计算的智能门禁系统架构设计分析
  • React03 组件 Props
  • 【C++初阶】模版入门看这一篇就够了
  • 华为Atlas显卡服务器查询计算卡型号
  • 如何通过接口版本控制实现向后兼容
  • Spring Boot:植物健康监测的智能专家
  • MATLAB中 exist函数用法
  • 【目标检测01】真实框、预测框、锚框和交并比IoU
  • CSS教程(一)- CSS介绍及使用方式
  • PHP免杀详细讲解PHP免杀详细讲解
  • SpringMVC8-HttpMessageConverter
  • 【30】C++子类相关
  • 大数据日志处理框架ELK方案
  • SpringBoot使用JpaRepository方法命名和@Query查询的一些复杂场景
  • js 简单模拟JSON.stringify 功能
  • 初始JavaEE篇——多线程(4):wait、notify,饿汉模式,懒汉模式,指令重排序
  • [vulnhub]Kioptrix: Level 1.2 (#3)
  • 2024年9月电子学会青少年软件编程Python等级考试(三级)真题试卷
  • 赛博威携手百度智能云,开启数字营销新未来
  • Docker Compose一键部署Spring Boot + Vue项目