模板网站建设的公司学校网站建设项目管理报告

张小明 2026/1/10 2:45:32
模板网站建设的公司,学校网站建设项目管理报告,中咨工程咨询有限公司,听书369进入公众号# 前言 拖拽排序是一种直观的交互方式#xff0c;用户可以通过长按并拖动来调整列表项的顺序。在笔记应用中#xff0c;拖拽排序可以用于调整笔记的显示顺序、任务清单的优先级、文件夹的排列等场景。一个流畅的拖拽排序功能需要提供清晰的视觉反馈和平滑的动画效果。本文将详…#前言拖拽排序是一种直观的交互方式用户可以通过长按并拖动来调整列表项的顺序。在笔记应用中拖拽排序可以用于调整笔记的显示顺序、任务清单的优先级、文件夹的排列等场景。一个流畅的拖拽排序功能需要提供清晰的视觉反馈和平滑的动画效果。本文将详细介绍如何在Flutter和OpenHarmony平台上实现拖拽排序功能。Flutter ReorderableListViewFlutter提供了ReorderableListView组件实现拖拽排序。classReorderableNotesPageextendsStatefulWidget{override_ReorderableNotesPageStatecreateState()_ReorderableNotesPageState();}class_ReorderableNotesPageStateextendsStateReorderableNotesPage{ListNote_notes[Note(id:1,title:笔记一),Note(id:2,title:笔记二),Note(id:3,title:笔记三),Note(id:4,title:笔记四),];overrideWidgetbuild(BuildContextcontext){returnReorderableListView.builder(itemCount:_notes.length,itemBuilder:(context,index){returnListTile(key:ValueKey(_notes[index].id),title:Text(_notes[index].title),trailing:ReorderableDragStartListener(index:index,child:Icon(Icons.drag_handle),),);},onReorder:(oldIndex,newIndex){setState((){if(newIndexoldIndex)newIndex--;finalitem_notes.removeAt(oldIndex);_notes.insert(newIndex,item);});},);}}ReorderableListView.builder是构建可排序列表的推荐方式。每个列表项必须有唯一的key通常使用数据的id。ReorderableDragStartListener提供拖拽手柄用户可以通过拖动手柄来排序而不是长按整个列表项。onReorder回调在排序完成时触发需要手动更新数据列表的顺序。注意当newIndex大于oldIndex时需要减1这是因为移除元素后索引会发生变化。ReorderableListView.builder(itemCount:_notes.length,proxyDecorator:(child,index,animation){returnAnimatedBuilder(animation:animation,builder:(context,child){finalelevationlerpDouble(0,8,animation.value);returnMaterial(elevation:elevation!,shadowColor:Colors.black45,child:child,);},child:child,);},itemBuilder:(context,index){returnNoteCard(key:ValueKey(_notes[index].id),note:_notes[index],);},onReorder:_handleReorder,)proxyDecorator属性可以自定义拖拽时的视觉效果。animation参数提供拖拽动画的进度值可以用于创建动态效果。这里使用lerpDouble在0和8之间插值计算阴影高度拖拽时卡片会浮起并显示阴影增强拖拽的视觉反馈。Material组件提供阴影效果让拖拽的项目看起来悬浮在其他项目之上。自定义拖拽效果有时需要更精细地控制拖拽行为。classDraggableNoteListextendsStatefulWidget{override_DraggableNoteListStatecreateState()_DraggableNoteListState();}class_DraggableNoteListStateextendsStateDraggableNoteList{ListNote_notes[];int?_draggingIndex;overrideWidgetbuild(BuildContextcontext){returnListView.builder(itemCount:_notes.length,itemBuilder:(context,index){returnLongPressDraggableint(data:index,feedback:Material(elevation:8,child:SizedBox(width:MediaQuery.of(context).size.width-32,child:NoteCard(note:_notes[index]),),),childWhenDragging:Opacity(opacity:0.5,child:NoteCard(note:_notes[index]),),onDragStarted:(){setState(()_draggingIndexindex);},onDragEnd:(details){setState(()_draggingIndexnull);},child:DragTargetint(onAccept:(fromIndex){_reorderNotes(fromIndex,index);},builder:(context,candidateData,rejectedData){returnNoteCard(note:_notes[index],isHighlighted:candidateData.isNotEmpty,);},),);},);}}LongPressDraggable和DragTarget组合可以实现更灵活的拖拽排序。LongPressDraggable在长按时开始拖拽feedback是拖拽时显示的WidgetchildWhenDragging是原位置显示的Widget。DragTarget是放置目标onAccept在拖拽项放置时触发。candidateData包含当前悬停在目标上的数据可以用于显示高亮效果。这种方式提供了完全的控制权可以实现任意复杂的拖拽交互。void_reorderNotes(int fromIndex,int toIndex){setState((){finalitem_notes.removeAt(fromIndex);if(toIndexfromIndex)toIndex--;_notes.insert(toIndex,item);_saveOrder();});}Futurevoid_saveOrder()async{finalorderData_notes.map((n)n.id).toList();awaitNoteService.saveNoteOrder(orderData);}排序完成后通常需要持久化保存新的顺序。_saveOrder方法将笔记ID列表保存到本地存储或服务器。这样用户下次打开应用时可以看到之前调整的顺序。排序数据的持久化是拖拽排序功能完整性的重要组成部分。OpenHarmony拖拽排序OpenHarmony通过List组件的拖拽功能实现排序。EntryComponentstruct ReorderableNotesPage{StatenoteList:NoteItem[][{id:1,title:笔记一},{id:2,title:笔记二},{id:3,title:笔记三},{id:4,title:笔记四}]build(){List(){ForEach(this.noteList,(item:NoteItem,index:number){ListItem(){Row(){Text(item.title).fontSize(16).layoutWeight(1)Image($r(app.media.drag_handle)).width(24).height(24).fillColor(#999999)}.width(100%).padding(15).backgroundColor(#FFFFFF)}},(item:NoteItem)item.id)}.editMode(true).onItemMove((from:number,to:number){this.moveItem(from,to)returntrue})}moveItem(from:number,to:number){letitemthis.noteList.splice(from,1)[0]this.noteList.splice(to,0,item)}}OpenHarmony的List组件通过editMode属性启用编辑模式在编辑模式下可以拖拽排序。onItemMove回调在拖拽排序时触发from和to分别是原索引和目标索引。ForEach的第二个参数是key生成函数确保每个项有唯一标识。moveItem方法使用splice操作数组实现元素移动。返回true表示接受这次移动操作。List(){ForEach(this.noteList,(item:NoteItem,index:number){ListItem(){this.NoteItemBuilder(item)}.swipeAction({end:this.DeleteButtonBuilder(index)})},(item:NoteItem)item.id)}.editMode(this.isEditMode).onItemMove((from:number,to:number){this.moveItem(from,to)returntrue}).onItemDelete((index:number){this.deleteItem(index)returntrue})BuilderDeleteButtonBuilder(index:number){Button(删除).backgroundColor(#FF4D4F).onClick((){this.deleteItem(index)})}List组件还支持滑动操作和删除功能。swipeAction配置滑动时显示的操作按钮end表示从右侧滑出。onItemDelete回调在删除操作时触发。这些功能可以与拖拽排序结合使用提供完整的列表管理能力。isEditMode状态变量可以控制是否启用编辑模式让用户在浏览和编辑模式之间切换。网格拖拽排序网格布局的拖拽排序适合图片或卡片的排列。ReorderableGridView.builder(gridDelegate:SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount:2,crossAxisSpacing:12,mainAxisSpacing:12,),itemCount:_notes.length,itemBuilder:(context,index){returnCard(key:ValueKey(_notes[index].id),child:Center(child:Text(_notes[index].title)),);},onReorder:(oldIndex,newIndex){setState((){finalitem_notes.removeAt(oldIndex);_notes.insert(newIndex,item);});},)ReorderableGridView提供网格布局的拖拽排序功能。gridDelegate配置网格的列数和间距与普通GridView的配置方式相同。拖拽时其他项会自动让出位置形成流畅的重排动画。网格拖拽排序适合笔记缩略图、图片相册等场景。拖拽排序的视觉反馈良好的视觉反馈可以提升拖拽体验。DragTargetint(onWillAccept:(data)data!index,onAccept:(fromIndex)_reorderNotes(fromIndex,index),builder:(context,candidateData,rejectedData){returnAnimatedContainer(duration:Duration(milliseconds:200),decoration:BoxDecoration(border:candidateData.isNotEmpty?Border.all(color:Colors.blue,width:2):null,borderRadius:BorderRadius.circular(8),),child:NoteCard(note:_notes[index]),);},)当拖拽项悬停在目标上方时显示蓝色边框作为放置提示。AnimatedContainer为边框的出现和消失添加动画效果。onWillAccept可以判断是否接受拖拽这里排除了拖拽到自身的情况。这种视觉反馈让用户清楚地知道可以放置的位置。总结拖拽排序是一种直观高效的交互方式Flutter和OpenHarmony都提供了相应的实现方案。开发者需要关注拖拽的视觉反馈、动画效果和数据持久化为用户提供流畅自然的排序体验。在笔记应用中拖拽排序可以让用户灵活地组织笔记顺序提升内容管理的效率。欢迎加入开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做域名交易网站大名县建设局网站

PowerToys命令模式是微软为Windows用户打造的革命性效率工具,通过智能命令执行界面彻底改变了传统操作方式。作为开源项目PowerToys的核心功能,它让普通用户也能享受到专业级的工作流优化体验。 【免费下载链接】PowerToys Windows 系统实用工具&#xf…

张小明 2026/1/9 0:49:40 网站建设

微信打不开网站陕西网站备案查询

凡早也是要办,晚也是要办,一定要早办;凡主动也是办,被动也是办,力争主动办;凡也可以去办,也可以不办,尽可能地办;凡冷淡也是办,热情也是办,要热情…

张小明 2026/1/7 21:29:54 网站建设

淘宝网站开发国家建设部网站倪虹

第一章:AI项目部署困境的根源剖析在AI技术迅猛发展的背景下,大量模型在实验室环境中表现出色,却难以在生产系统中稳定运行。这种“研发-部署”断层已成为制约AI商业化的关键瓶颈。其背后并非单一因素所致,而是由技术、流程与组织结…

张小明 2026/1/7 21:29:57 网站建设

宠物商品销售网站开发背景万建站南昌

还在为繁琐的媒体播放设置而烦恼吗?🤔 今天我们将深入探讨如何通过Jellyfin Android TV客户端,将您的智能电视或机顶盒升级为功能强大的家庭媒体中心。这款开源应用不仅提供了流畅的大屏操作体验,更让您完全掌控自己的媒体内容&am…

张小明 2026/1/7 21:29:59 网站建设

临海市住房与城乡建设规划局 网站建设商务公司网站

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 请用Python3.7编写一个性能对比测试程序,比较以下场景在Python3.6和3.7中的执行效率:1) 数据类实例化;2) 异步IO操作;3) 字典操作&am…

张小明 2026/1/7 21:29:58 网站建设

石狮网站建设价格网站怎么做显得简洁美观

构建高可用流媒体服务:ZLMediaKit集群部署完整方案 【免费下载链接】ZLMediaKit 项目地址: https://gitcode.com/gh_mirrors/zlm/ZLMediaKit ZLMediaKit集群部署是实现高可用流媒体架构的关键技术方案,能够有效应对大规模并发访问场景下的服务稳…

张小明 2026/1/7 21:29:58 网站建设