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

及时做APP开发实战(十四)-专注页面待办选择优化

及时做APP开发实战(十四)-专注页面待办选择优化

本文将介绍如何修复专注页面待办任务只显示5条的BUG,并优化弹窗交互体验。

一、问题分析

1.1 问题现象

┌─────────────────────────────────────┐ │ 选择待办任务 │ ├─────────────────────────────────────┤ │ ┌─────────────────────────────┐ │ │ │ ☐ 学习ArkTS基础 │ │ │ │ ☐ 开发及时做APP │ │ │ │ ☐ 写博客文档 │ │ │ │ ☐ 代码优化 │ │ │ │ ☐ 测试功能 │ │ │ └─────────────────────────────┘ │ ← 只显示5条 │ │ │ (实际有10条待办,但看不到) │ └─────────────────────────────────────┘

1.2 问题原因

问题分析: ┌─────────────────────────────────────┐ │ bindSheet height: 400 │ │ ↓ │ │ 弹窗高度固定为400vp │ │ ↓ │ │ List组件可滚动,但弹窗高度不够 │ │ ↓ │ │ ❌ 用户无法看到更多待办 │ └─────────────────────────────────────┘

二、bindSheet弹窗详解

2.1 bindSheet基本用法

@Componentstruct MyComponent{@StateshowSheet:boolean=false;build(){Column(){Button('打开弹窗').onClick(()=>{this.showSheet=true;})}.bindSheet($$this.showSheet,this.MySheet(),{height:400,// 弹窗高度backgroundColor:Color.White,// 背景色dragBar:true,// 拖拽栏onWillDismiss:()=>{// 关闭回调this.showSheet=false;}})}@BuilderMySheet(){Column(){Text('弹窗内容')}}}

2.2 弹窗高度设置

属性说明推荐值
height弹窗高度300-600vp
dragBar是否显示拖拽栏true
backgroundColor背景颜色根据主题

2.3 弹窗高度计算

┌─────────────────────────────────────┐ │ 弹窗高度计算 │ ├─────────────────────────────────────┤ │ 标题栏高度:约50vp │ │ 列表项高度:约60vp │ │ 内边距:约30vp │ │ ───────────────────── │ │ 显示5条:50 + 60×5 + 30 = 380vp │ │ 显示8条:50 + 60×8 + 30 = 560vp │ │ 显示10条:50 + 60×10 + 30 = 680vp │ └─────────────────────────────────────┘

三、解决方案

3.1 修改前代码

.bindSheet($$this.showTodoPicker,this.TodoPickerSheet(),{height:400,// ❌ 高度不够backgroundColor:this.isDarkMode?'#2D2D2D':Color.White,dragBar:true,onWillDismiss:()=>{this.showTodoPicker=false;}})

3.2 修改后代码

.bindSheet($$this.showTodoPicker,this.TodoPickerSheet(),{height:500,// ✅ 增加高度backgroundColor:this.isDarkMode?'#2D2D2D':Color.White,dragBar:true,onWillDismiss:()=>{this.showTodoPicker=false;}})

3.3 弹窗内容优化

@BuilderTodoPickerSheet(){Column(){// 标题栏Row(){Text('选择待办任务').fontSize(20).fontWeight(FontWeight.Bold)Blank()Button('取消').onClick(()=>{this.showTodoPicker=false;})}.width('100%').padding(15)Divider()// 待办列表 - 可滚动List({space:10}){ForEach(this.todoList,(todo:TodoItem)=>{ListItem(){this.TodoItemCard(todo)}},(todo:TodoItem)=>todo.id.toString())}.width('100%').layoutWeight(1)// 占满剩余空间.padding(15)}.width('100%').height('100%')}

四、交互体验优化

4.1 拖拽栏功能

┌─────────────────────────────────────┐ │ 拖拽栏交互 │ ├─────────────────────────────────────┤ │ ┌─────────────────────────────┐ │ │ │ ═══════ │ │ ← 拖拽栏(可拖动) │ │ │ │ │ │ 选择待办任务 │ │ │ │ ───────────── │ │ │ │ ☐ 待办1 │ │ │ │ ☐ 待办2 │ │ │ │ ... │ │ │ └─────────────────────────────┘ │ │ │ │ 用户可以: │ │ - 向上拖动:展开弹窗 │ │ - 向下拖动:收起弹窗 │ │ - 拖到底部:关闭弹窗 │ └─────────────────────────────────────┘

4.2 列表滚动优化

List({space:10}){ForEach(this.todoList,(todo:TodoItem)=>{ListItem(){this.TodoItemCard(todo)}})}.width('100%').layoutWeight(1).edgeEffect(EdgeEffect.Spring)// ✅ 添加弹性滚动效果.nestedScroll({// ✅ 嵌套滚动支持scrollForward:NestedScrollMode.PARENT_FIRST,scrollBackward:NestedScrollMode.SELF_FIRST})

4.3 空状态处理

if(this.todoList.length===0){// 空状态提示Column(){Text('暂无可选待办').fontSize(16).fontColor('#999999')Text('请先添加待办任务').fontSize(14).fontColor('#CCCCCC').margin({top:10})Button('去添加').margin({top:20}).onClick(()=>{// 跳转到待办页面})}.width('100%').height('100%').justifyContent(FlexAlign.Center)}else{// 待办列表List(){...}}

五、完整代码示例

5.1 待办选择弹窗

@BuilderTodoPickerSheet(){Column(){// 标题栏Row(){Text('选择待办任务').fontSize(20).fontWeight(FontWeight.Bold).fontColor(this.isDarkMode?'#FFFFFF':'#333333')Blank()Button('取消').fontSize(14).fontColor(this.themeColors.primary).backgroundColor(Color.Transparent).onClick(()=>{this.showTodoPicker=false;})}.width('100%').padding({left:20,right:20,top:15,bottom:15})Divider().color(this.themeColors.border)// 待办列表if(this.todoList.length===0){this.EmptyState()}else{List({space:10}){ForEach(this.todoList,(todo:TodoItem)=>{ListItem(){this.TodoItemCard(todo)}},(todo:TodoItem)=>todo.id.toString())}.width('100%').layoutWeight(1).padding({left:15,right:15,top:10,bottom:10})}}.width('100%').height('100%').backgroundColor(this.isDarkMode?'#2D2D2D':'#F5F5F5')}

5.2 待办卡片

@BuilderTodoItemCard(todo:TodoItem){Row(){// 番茄钟图标Text('🍅').fontSize(24)// 待办信息Column(){Text(todo.text).fontSize(16).fontColor(this.isDarkMode?'#FFFFFF':'#333333').maxLines(1).textOverflow({overflow:TextOverflow.Ellipsis})if(todo.pomodoroCount>0){Text(`已完成${todo.pomodoroCount}个番茄钟`).fontSize(12).fontColor(this.isDarkMode?'#AAAAAA':'#999999').margin({top:4})}}.layoutWeight(1).alignItems(HorizontalAlign.Start).margin({left:12})// 选择图标if(this.currentTodo?.id===todo.id){Text('✓').fontSize(20).fontColor(this.themeColors.primary)}}.width('100%').padding(15).backgroundColor(this.isDarkMode?'#3D3D3D':'#FFFFFF').borderRadius(12).onClick(()=>{this.currentTodo=todo;this.showTodoPicker=false;})}

六、总结

本文修复了专注页面待办选择只显示5条的问题,核心要点:

  1. 问题原因:弹窗高度固定为400vp,不够显示更多内容
  2. 解决方案:增加弹窗高度到500vp
  3. 优化建议:添加拖拽栏、滚动效果、空状态处理

http://www.jsqmd.com/news/1216999/

相关文章:

  • .NET技术周刊:2024年6月第1期核心内容解析
  • 嵌入式引脚复用配置详解:从寄存器原理到OMAP4460实战
  • 代码生成工具从DeepSeek到Kimi K3的工程化演进与实践
  • DHT11温湿度传感器在航天领域的应用与优化
  • Windows批处理脚本入门与实战技巧
  • 多维聚合数据变形术:维度感知的整形协议与实战避坑
  • 江诗丹顿中国官方售后服务中心|官方地址及售后服务电话权威信息公示(2026年7月最新) - 江诗丹顿服务中心
  • 工业控制系统通信协议解析与应用实践
  • 如何彻底清理Windows右键菜单臃肿:ContextMenuManager完整使用指南
  • 2026年7月目前评价高的石膏砂浆设备品牌口碑推荐,腻子粉设备/粉体包装机/除尘设备/输送设备,石膏砂浆设备直销厂家推荐 - 品牌推荐师
  • STM32 DMA技术解析与高效数据传输实践
  • 深入解析MMC/SD/SDIO主机控制器:DMA、中断与缓冲区管理实战
  • 程序员冥想实践:提升代码质量与调试效率的认知科学方法
  • 【2027最新】基于SpringBoot+Vue的社区物资交易互助平台管理系统源码+MyBatis+MySQL
  • Android自定义View实现精美模拟时钟开发指南
  • 江诗丹顿中国官方售后服务中心|服务热线及网点地址权威信息公示(2026年7月更新) - 江诗丹顿官方服务中心
  • 基于内容的推荐系统:冷启动场景下的可解释推荐实践
  • Rust与C/C++互调技术:FFI原理与实战指南
  • 英特尔Nova Lake架构实现AVX-512全核支持,突破混合架构性能瓶颈
  • 嵌入式视觉系统开发:深入解析Camera ISP时钟、电源与中断协同设计
  • 《冰雪传奇点卡版》正版官方客户端下载指南,冰雪传奇点卡版最新官网下载正规渠道
  • Wav2Vec 2.0语音识别实战:端到端中文STT部署与避坑指南
  • Rust语言入门:从安装到核心概念解析
  • 【2027最新】基于SpringBoot+Vue的社区医疗服务可视化系统管理系统源码+MyBatis+MySQL
  • 汽油发电机逆变器智能控制系统解析与应用
  • Java邮件发送开发指南:从基础到企业级实践
  • Muse Spark 1.1:AI驱动的代码理解与文档生成实战指南
  • 长沙爱彼回收价格查询及各大平台实测排行(2026年7月最新数据) - 尊奢回收二奢平台
  • BIM轻量化引擎选型:Unity与Three.js技术对比与实战指南
  • AI如何重构约会软件匹配逻辑:从协同过滤到对话生成