【时间盒子】-【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目录中。

下一篇:任务修改

双工具协作:timeboss+进客盒子打造高效电脑自律体系 在信息过载的数字时代,电脑用机效率低下成为普遍痛点。时间管理并非仅靠意志力,而需要正向规划与反向拦截的双重机制。自律工具通过规则设定与任务引导,帮助用户将碎片时间转化为有效产出。无论是远程办公、自由职业还是学生自习,结合专注计时与软件管控,都能显著提升工作专注度。基于此,本文以timeboss与进客盒子的组合为例,拆解一套从规划、执行到复盘的电脑自律管理实战方案。 阅读详情

相关推荐

RAG在医药行业为什么80%都翻车了?

这篇文章不是要劝你别做RAG,而是把坑说清楚。医药行业有它的特殊性——监管压力、专业术语密度、多语言混排、文档结构复杂——这些因素叠加在一起,让标准RAG教程里的那套方法论几乎直接失效

qq_31808385的博客 635

超越的时间管理之时间盒子

简单地说,时间盒是我所知道的最有效的时间管理方式。即使在某种程度上你已经知道如何使用它,但通过下面的策略你肯定会做得更好!  对于新手来,简单地说,时间盒就是把时间段分配到一个或一组任务。在特定的时间去完成任务而不是直到它已经完成了才去做它。  但不要让这个简单的概念欺骗你----它可比你眼中的要更有用。  许多人已经介绍过它,尽管他们的工作卓有成效,但我还是想分享以

超越的博客 2543

从零搭建SPI通信系统:AXI Quad SPI IP核在Xilinx平台上的完整配置流程

本文详细介绍了在Xilinx平台上使用AXI Quad SPI IP核从零搭建SPI通信系统的完整配置流程。涵盖IP核架构解析、Vivado环境配置、寄存器编程实战及性能优化策略,帮助开发者快速实现高速稳定的SPI通信,特别适用于嵌入式系统开发中的外围设备连接需求。

hh234的博客 1052

Canvas画板实现一个简单的球在盒子内随机移动效果

HTML5入门之Canvas:如何用Canvas画板实现一个简单的球在盒子内随机移动效果 作者:html5Game | 时间:2014-2-25 17:05:14 | [小  大] | 来源:HTML5 | 阅读:12457 |   评论: 0 |  收藏 HTML5入门Canvas画板实现球简单盒子随机移动    [摘要]: HTML5提供了一个非常好的标签

sina_panda 5780

Git系列(一)、Git基础教程【建议收藏】

Git一、Git简介1.1、什么是Git? 一、Git简介 1.1、什么是Git? Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或大或小的项目。 Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源代码的版本控制软件。 Git与常用的版本控制工具CVS、Subversion等不同,它采用了分布式版本库的方式,不用服务器端软件支持。 .........

一宿君 4万+

基于Android13的系统启动流程分析(三)之FirstStageMain阶段

init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等。init进程是由多个源文件共同组成的,这些文件位于源码目录system/core/init1. Bootloader 引导当按下设备电源键时,最先运行的就是 bootloader(固化在ROM的程序),bootloader 的主要作用就是硬件设备(如 CPU、flash、内存)的初始化并加载到RAM,通过建立内存空间映射,为装载 Linux 内核做好准备,。

q1210249579的博客 5496

8个球放入3个盒子方式_豆乳盒子、奥利奥盒子。。 好看又好吃的蛋糕,在家就能轻松做...

不知道咋回事,只要一遇上甜点,食量就成了薛定谔的食量。明明已经很饱了,但是如果别人问要不要吃蛋糕,就觉得我还可以!诶,我的勺子呢?快扶我起来我还能吃!盒子蛋糕虽然很多人说已经过时了,但是其实它还一直那么火爆,而且评论都说非常好吃!这种蛋糕十分方便携带,想吃的时候带上一盒,为大家整理了几款盒子蛋糕的做法,好吃到泪流。豆乳盒子准备材料蛋糕片 1块 / 自制豆浆 180g / 糖 40g鸡蛋黄 2个 /...

weixin_30431137的博客 193

ChromeOS安装教程

ChromeOS,是基于Linux内核研发的ChromiumOS开源系统的闭源系统,最大的特色就是内置了Chrome浏览器,早期主要以Web云端应用程序为主,后来逐渐引入了Android子系统和Linux子系统。本文主要简述摸索的家用笔记本安装ChromeOS安装方法,供各位玩机朋友参考。

weixin_45751495的博客 8112

CSS盒子模型

网页的元素基本上都是放在盒子上进行的。

爱踢粪球的虫 899

华为OD机试双机位A卷 - VLAN资源池 (C++ & Python & JAVA & JS & GO)

华为OD机试2025双机位A卷 VLAN资源池,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 878

嵌入式STM32F407CET6移植OpenHarmony系统方法

文件末尾添加:export PATH=~/gcc-arm-none-eabi-10-2020-q4-major/bin:$PATH。编译完成文件输出在LiteOs源码目录下out/STM32F407_ATK_Explorer文件夹中。②点击connect to the target,下方会自动显示识别出来的芯片型号以及flash大小。⑤点击program verify并点击start,等待烧写并校验完成,你就能看到程序正在运行了。,在选择刚才我们说的Huawei_LiteOS.hex文件。

嵌入式技术开发 546

1盒子刷Armbian,看这一篇就够了——Armbian全方位安装指导书

N1盒子刷Armbian,看这一篇就够了——Armbian全方位安装指导书 2020-03-30 19:04:1172点赞715收藏122评论 创作立场声明:一个写完之后很累很累的年轻人 追加修改(2020-03-31 22:49:31): 安装系统至eMMC代码为“nand-sata-install”,前发有一个标点错误,会导致写入失败,感谢13楼值友@sharphe 看过我上周文章的朋友可能还记得,刚刚入手不过两个小时的N1盒子甚至还没有写开箱就被我刷成了砖,本来是第一篇的“N1盒子刷...

ylz_yg的博客 7万+

OpenCASCADE:写IGES

OpenCASCADE:写IGES程序涵盖的领域流程说明初始化过程设置翻译参数执行 Open CASCADE Technology 形状转换编写 IGES 文件将开放级联技术形状映射到 IGES 实体曲线表面拓扑实体——人脸模式下的平移公差管理在 IGES 文件中设置分辨率代码架构调用图例子 程序 您可以通过以下步骤将 OCCT 形状转换为 IGES 实体: 初始化进程。 设置翻译参数, 执行模型翻译, 写入输出 IGES 文件。 您可以在写入文件之前转换多个形状。每个形状都将是 IGES 模型中的根实体。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 923

实践任务1:利用 HBuilderX制作产品展示模块+实践任务2:利用 HBuilderX制作公司网站首页+实践任务3: 利用 HBuilderX制作公司网站首页实现固定侧边菜单

实践任务1:制作产品展示模块+实践任务2:制作公司网站首页+实践任务3 公司网站首页实现固定侧边菜单

听风者i的博客 3682

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

当小球遇上盒子

小球与盒子问题 这类问题是求解把一些小球放进一些盒子里的本质不同的方案数。 通过球相同/不同,盒子相同/不同,能/不能有空盒分成了8个不同的问题。 本篇文章会分别对这8个问题进行分析求解。 前置芝士&amp;复习巩固 组合数 :从nnn个物品里选出m个物品进行组合的方案数。 Cnm=n!m!⋅(n−m)!C_{n}^{m}=\frac{n!}{m!\cdot (n-m)!}Cnm​=m!⋅...

Shelter 1062

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【时间盒子】-【8.时间选择器】自定义上下午、时分选择器组件

Tips: 层叠布局Stack; 滑动选择文本组件TextPicker;

与辉鸿蒙 674

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

8个球放入3个盒子方式_新鲜的果肉,绵密的蛋糕,丰富层次感的蛋糕盒子简单好做又好吃...

不知道咋回事,只要一遇上甜点,食量就成了薛定谔的食量。明明已经很饱了,但是如果别人问要不要吃蛋糕,就觉得我还可以!诶,我的勺子呢?快扶我起来我还能吃!盒子蛋糕虽然很多人说已经过时了,但是其实它还一直那么火爆,而且评论都说非常好吃!这种蛋糕十分方便携带,想吃的时候带上一盒,为大家整理了几款盒子蛋糕的做法,好吃到泪流。豆乳盒子准备材料蛋糕片 1块 / 自制豆浆 180g / 糖 40g鸡蛋黄 2个 /...

weixin_39747577的博客 149

n个小球放入m个盒子中_牛乳蛋糕盒子

前几天在罗森买了一盒牛乳蛋糕,娃吃了之后就爱上了,所以老母亲又开始学习啦。其实牛乳蛋糕就是慕斯蛋糕,为了不让娃一次次太多,我做成了蛋糕盒子。 牛乳蛋糕分成两部分,一部分是蛋糕胚部分,我做的是戚风蛋糕。另一部分是慕斯糊部分。因为家里还有一些奥利奥饼干碎,所以我又加了一些奥利奥饼干碎,增加风味,丰富口感。 此配方的用量中,慕斯糊部分我做了2个709ml+1个280ml的蛋...

weixin_28856717的博客 133

Cocos Creator Spine动画时间轴(事件时间轴,骨骼时间轴)

cocos版本:2.3.4 spine版本:3.8 帧同步和Spine动画同步的问题 这个主要是做帧同步时,spine动画上有自定义事件抛出,且动画骨骼上绑定了伤害判定的盒子。 因为动画不是逻辑帧来驱动的,所以不同客户端播放动画速度不一样,那么在相同逻辑帧时, 可能A已经播放完成,而B还在播放动画中,那么判断就会不一致。 例如一个人物挥拳,伤害判定盒子在拳头上,A在逻辑帧10的时...

gamedaybyday 4049

【入门】【例6.3】 套盒子

【信息学奥赛一本通】【顺序结构】

qq_40197535的博客 280

挑战52天学小猪佩奇笔记--day13

今天旁白没有知识点嗷

stsongY的博客 864

安卓盒子装mysql_IT入门必备 篇二:安卓盒子改造六核web服务器

IT入门必备 篇二:安卓盒子改造六核web服务器2020-08-13 16:29:479点赞40收藏4评论小编注:此篇文章来自即可瓜分10万金币,周边好礼达标就有,邀新任务奖励无上限,点击查看活动详情创作立场声明:产品来自以前旧货再利用,没事瞎折腾,把旧电视盒子弄成文件服务器。序:去年收拾收拾房屋,翻出来一个杂牌电视盒子,想着没事干瞎折腾的原则,分享一下瞎折腾安卓盒子的文章。计划弄个低访问率的云盘...

weixin_36484519的博客 863

html,body区域添加一个水平垂直居中的盒子

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <style type="text/css" media="sc...

dicishi0158的博客 559

三分钟拿到最新 TVBoxOSC:电视盒子播放器自动构建与发布指南

给电视盒子装播放器,最头疼的往往不是播放本身,而是版本:上游仓库分散在几个分支线里,想要一个能直接安装的包,得自己拉代码、自己配签名。TVBoxOSC 解决的就是这一步——它盯着 TVBox 系上游仓库的每次提交,每天自动构建、签名并公开发布 APK,你只需要下载最新安装包。 ## 🎯 明确项目定位:它不是新的播放引擎 先说清楚它是什么。TVBoxOSC 是一个面向电视盒子控制与管理的代码库

gitblog_00713的博客 534

斐讯盒子t1 刷Android,T1刷机的详细步骤

本帖最后由 liaozili8 于 2018-7-2 17:39 编辑6.18入手了三个斐讯T1盒子,收到后总想着刷机,折腾了好一阵子,终于搞明白道理。特把步骤写出来,给后来的兄弟们,少走弯路减少麻烦。USB_Burning_Tool v2.1.2 USB-Burning 2.0.5这连个软件那个都可以2.1.2 是安装包2.0.5 是免安装包。2:现在入手的盒子,固件都比较新,需...

weixin_35772595的博客 9981

华为昇腾910B4(A2)服务器环境搭建笔记

Qwen3.5 默认支持思考模式。首次测试建议关闭思考模式,更容易判断模型是否成功回答。我建议把模型统一存放在宿主机的 /data/models 目录中。这样即使删除 Docker 容器,模型文件也不会丢失。这里先进行单卡测试,确保容器能正确调用 NPU。安装ModelScope 用于下载模型。继续在刚才的容器内部执行。

guoqingru0311的博客 300
上一篇: 【时间盒子】-【12.任务时长弹窗】设置/修改任务时长
下一篇: 【时间盒子】-【14.任务编辑】修改删除任务
鸿花粉
博客等级 码龄20年 321粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸿花粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值