鸿蒙开发之@State案例

基于@State来创建一个任务管理的案例。

//任务类
class Task {
  static  id: number = 1
  name:string = '任务名称'+Task.id++
  finished:boolean = false
}

//公共卡片样式
@Styles function  card() {
  .width('90%')
  .padding(20)
  .backgroundColor(Color.White)
  .borderRadius(15)
  .shadow({radius:6,color:'#1F00000',offsetX:2,offsetY:4})
}

//扩展Text的样式,完成效果
@Extend(Text) function successd() {
  .decoration({type: TextDecorationType.LineThrough})
  .fontColor('#B1B2B1')
}


@Entry
@Component
struct  ProgressTask {

  @State totalTasks: number = 0
  @State finishTasks:number = 0
  @State tasks: Task[] = []

  handleTaskNumber() {
    this.totalTasks = this.tasks.length
    this.finishTasks = this.tasks.filter(item =>
      item.finished
    ).length
    console.log('完成任务数'+this.finishTasks)
  }

  build() {
    Column() {
      //进度卡片
      Row() {
        Text('任务进度:')
          .fontWeight(FontWeight.Bold)
          .fontSize(30)
          .layoutWeight(1)
        
        //Stack组件可以让内部的组件堆叠
        Stack() {
          
   //Progress进度条
    Progress({value:this.finishTasks,total:this.totalTasks,type:ProgressType.Ring})
            .width(100)

          Row() {
            Text(this.finishTasks.toString())
              .fontSize(24)
              .fontColor('#36D')

            Text(' / '+this.totalTasks.toString())
              .fontSize(24)
          }
        }

      }
      .card()
      .height(150)
      .margin({top:20,bottom:10})
      .justifyContent(FlexAlign.SpaceEvenly)

      //添加按钮
      Button('新增任务')
        .width(200)
        .height(35)
        .onClick(() => {
          this.tasks.push(new Task())
          this.handleTaskNumber()
        })
      .margin({bottom:20})
      
      //任务列表
      List({space:10}){
        ForEach(this.tasks,(task:Task,index) => {
          ListItem() {
            Row(){
              Text(task.name)
                .fontSize(20)

              Checkbox()
                .select(task.finished)
                .onChange(value => {
                  task.finished = value
                  console.log('任务状态'+value+'')
                  this.handleTaskNumber()
                })
            }
            .card()
            .justifyContent(FlexAlign.SpaceBetween)
          }
          .swipeAction({end:this.deleteButton(index)})
        },item => ''+item.name)
      }
      .width('100%')
      .alignListItem(ListItemAlign.Center)
      .layoutWeight(1)
    }
    .width('100%')
    .height('100%')
  }

  //ListItem左滑返回视图
  @Builder deleteButton(index:number) {
    Button('➖')
    .fontColor(Color.White)
    .backgroundColor(Color.Red)
    .width(40)
    .height(40)
    .type(ButtonType.Circle)
    .margin({left:5})
    .onClick(() => {
      this.tasks.splice(index,1)
      this.handleTaskNumber()
    })
  }
}

开发过程中的新知识点

1、Stack组件

该组件支持内部的组件堆叠

 Stack() {
      Text('任务进度1:')
          .fontWeight(FontWeight.Bold)
          .fontSize(30)
          .layoutWeight(1)


    Text('任务进度2:')
          .fontWeight(FontWeight.Bold)
          .fontSize(30)
          .layoutWeight(1)
}

2、数组的添加删除元素方式

 //插入一个元素
 this.tasks.push(Element)

 //删除从index起length个元素
 this.tasks.splice(index,length)

3、勾选框CheckBox组件

Checkbox()
    //选中状态
    .select(task.finished)
    .onChange(value => { 
         //状态改变回调
    })

4、Progress组件

//value是当前进度,total总值,type样式          
Progress({value:this.finishTasks,total:this.totalTasks,type:ProgressType.Ring})

5、给ListItem添加左滑事件

 ListItem() {
      Row(){
        Text(task.name)
          .fontSize(20)
      }
      .justifyContent(FlexAlign.SpaceBetween)
    }
   .swipeAction({end:this.deleteButton(index)})
  },item => ''+item.name)

6、遇到的坑

在做的过程中,最开始Task的name,id等都是一样的,然后,导致处理ListItem各种异常,应该是复用刷新机制的问题。后来处理成name不一样,并且将name设置为ListItem的keyGenerator。这个字段我理解为原生开发的复用ID。因为每个task的id一样导致ListItem没有刷新。这个待后期学习验证。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/237824.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】注意力机制(二)

本文介绍一些注意力机制的实现,包括EA/MHSA/SK/DA/EPSA。 【深度学习】注意力机制(一) 【深度学习】注意力机制(三) 目录 一、EA(External Attention) 二、Multi Head Self Attention 三、…

数据在内存中的存储(浮点型篇)

1.例子:5.5:内存存储为101.1,十分位百分位依次为2的-1次方,2的-2次方,而使用科学计数法可以改写为1.011*2的2次方 2.国际标准公式:-1的D次方*M*2的E次方,x1负0正 3.M在存储时默认整数部分为1&…

C 语言指针学习笔记

C 语言中,指针存储的是变量的内存地址!!! 要彻底理解指针,首先要理解 C 语言中变量的存储本质,也就内存。 内存编址与内存空间 计算机的内存是一块用于存储数据的空间,由一系列连续的存储单元…

Python 反编译Il2Cpp APK

引入 https://github.com/Perfare/Il2CppDumper/ 实现 开源的Ii2Cpp Dumper可以帮助我们将So和globalmetadata.dat文件反编译出 Assembly-CSharp.dll 本博客教程可以帮助我们直接拖入APK反编译出来 调用方式 两种 第一种 拖入后回车运行 第二种 放入运行的根目录下 源码 i…

手动搭建koa+ts项目框架(日志篇)

文章目录 前言一、安装koa-logger二、引入koa-logger并使用总结如有启发,可点赞收藏哟~ 前言 本文基于手动搭建koats项目框架(路由篇)新增日志记录 一、安装koa-logger npm i -S koa-onerror and npm i -D types/koa-logger二、引入koa-lo…

IoTDB JavaAPI

文章目录 使用样例Java使用样例 官方已经给出了相关使用Demo,下载地址为: https://github.com/apache/iotdb 直接拉取相对应版本的源码 使用样例 Java使用样例 代码位置 iotdb/example/session/src/main/java/org/apache/iotdb/SessionExample.java iotdb/exa…

借助 AI 梳理知识:Quivr 帮你打造第二大脑 | 开源日报 No.103

fastlane/fastlane Stars: 37.8k License: MIT fastlane 是一个用于 iOS 和 Android 开发人员自动化繁琐任务的工具,如生成屏幕截图、处理配置文件和发布应用程序。 可以轻松地生成屏幕截图处理证书文件发布应用程序通过命令行快速执行操作 DrKLO/Telegram Sta…

血的教训,BigDecimal踩过的坑

很多人都用过Java的BigDecimal类型,但是很多人都用错了。如果使用不当,可能会造成非常致命的线上问题,因为这涉及到金额等数据的计算精度。 首先说一下,一般对于不需要特别高精度的计算,我们使用double或float类型就可…

【lesson7】数据类型之string类型

文章目录 数据类型分类string类型set类型测试 enum类型测试 string类型的内容查找找所有女生(enum中)找爱好有游泳的人(set中)找到爱好中有足球和篮球的人 数据类型分类 string类型 set类型 说明: set:集…

nrfutil工具安装

准备工作,下载相关安装包 链接:https://pan.baidu.com/s/1LWxhibf8LiP_Cq3sw0kALQ 提取码:2dlc 解压后,分别安装以下安装包 在C盘下创建目录nordic_tools,并将nrfutil复制到刚创建的目录下 环境变量path下添加C:\nor…

【截图版本】Linux常用指令详解

———————————————— 版权声明:本文为CSDN博主「小呆瓜历险记」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/m0_58963318/article/details/134713282

ProroBuf C++笔记

一.什么是protobuf Protocol Buffers是Google的⼀种语⾔⽆关、平台⽆关、可扩展的序列化结构数据的⽅法,它可⽤于(数据)通信协议、数据存储等。Protocol Buffers 类⽐于XML,是⼀种灵活,⾼效,⾃动化机制的结…

51单片机应用从零开始(十一)·数组函数、指针函数

51单片机应用从零开始(九)数组-CSDN博客 51单片机应用从零开始(十)指针-CSDN博客 目录 1. 用数组作函数参数控制流水花样 2. 用指针作函数参数控制 P0 口 8 位 LED 流水点亮 1. 用数组作函数参数控制流水花样 要在51单片机中…

0012Java安卓程序设计-ssm记账app

文章目录 **摘要**目 录系统设计5.1 APP端(用户功能)5.2后端管理员功能模块开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅🐧裙:776871563 摘要 网络的广泛应用给生活带来了十分的便利。所以把记账管理与现在网络相…

GaussDB数据库语法及gsql入门

一、GaussDB数据库语法入门 之前我们讲了如何连接数据库实例,那连接数据库后如何使用数据库呢?那么我们今天就带大家了解一下GaussDB,以下简称GaussDB的基本语法。 关于如何连接数据库,请戳这里。 学习本节课程之后&#xff0c…

【金华模式】双龙旅游引燃露营设计和文旅产融合新方式

(中国国际教育电视台 黎明)金华双龙风景旅游区位于浙江省金华市北郊的金华山麓,是一处融自然山水、溶洞群景观、科普探险、康体休闲、避暑度假、观光朝圣于一体的景区。旅游区人文积淀深厚,道、儒、释文化兼收并蓄,东汉…

大语言模型有什么意义?亚马逊训练自己的大语言模型有什么用?

近年来,大语言模型的崭露头角引起了广泛的关注,成为科技领域的一项重要突破。而在这个领域的巅峰之上,亚马逊云科技一直致力于推动人工智能的发展。那么,作为一家全球科技巨头,亚马逊为何会如此注重大语言模型的研发与…

Blender学习:走路机器人,骨骼绑定

文章目录 建模骨骼创建骨骼绑定 教程地址:八个案例教程带你从0到1入门blender【已完结】 建模 1 做头:新建立方体,Ctrl2细分并应用,进入编辑模式,删除一半点,然后添加镜像修改器,开启范围限制…

软件测试20个基础面试题及答案

什么是软件测试? 答案:软件测试是指在预定的环境中运行程序,为了发现软件存在的错误、缺陷以及其他不符合要求的行为的过程。 软件测试的目的是什么? 答案:软件测试的主要目的是保证软件的质量,并尽可能…

python socket编程9 - PyQt6界面实现UDP server/client 多客户端通讯的例子

本篇实现 UDP server和client多客户端通讯的例子。 在UDP单机通讯的基础上进行重构,实现UDP server与多个 client通讯的例子。 创建两个 PyQt6的项目,一个作为UDP server 项目,另一个作为UDP client项目。 一、效果图 1、udp server界面 …