Flutter Key的原理和使用(一) 没有Key会发生什么

Flutter Key的原理和使用(二) Widget 和 Element 的对应关系

Flutter Key的原理和使用(三) LocalKey的三种类型

Flutter Key的原理和使用(四) GlobalKey 的用法

Flutter Key的原理和使用(五) 需要key的实例:可拖动改变顺序的Listview

之前呢,我们介绍了flutter中的几种key,它们相应的原理和使用方式, 这次就来复习一下,看看一个需要用到key的实例.

ReorderableListView

你可能使用过ListView组件,它可以调整,显示和滚动项目列表. 但是不能做的一件事就是在列表中移动项目.幸运的是,有ReorderableListView.

ReorderableListView是不个不常用的ListView组件.它是一个用户可以通过拖动来重新排序其项目的列表组件. 有了它,我们可以通过长按项目来在ListView的滚动方向移动它,将其放在新的位置.

它有一个要求: 所有列表项都必须有一个Key
并且必须实现onReorder方法,它是用户在重新排序列表时调用的回调方法,看一下没有实现这个回调的效果:

ReorderableListView(children: [Box(Colors.blue, key: ValueKey(1)),Box(Colors.green, key: ValueKey(2)),Box(Colors.red, key: _globalKey),],onReorder: (oldIndex, newIndex) {print('从位置$oldIndex移动到$newIndex');},
)

可以看到虽然我们交换了红绿两个box,但是松手之后UI并没有变化,就是因为没有没有实现onReorder.

onReorder: (oldIndex, newIndex) , 分别有两个参数,oldIndex和newIndex, 它们代表的含义就是,拖动的widget拖动前和拖动后的index. 看一下打印结果:

从位置2移动到1

说明是从第2个位置移动到了第1个位置(最开始是第0的位置).
每当发生这样改变的时候,我们就需要把list组件修改.
修改一下我们的代码,移除旧位置的widget,在新的位置插入它:

final boxList = [Box(Colors.blue, key: ValueKey(1)),Box(Colors.green, key: ValueKey(2)),Box(Colors.red, key: ValueKey(3)),
];Widget listWidget() {return ReorderableListView(children: boxList,onReorder: (oldIndex, newIndex) {print('从位置$oldIndex移动到$newIndex');final box = boxList.removeAt(oldIndex);boxList.insert(newIndex, box);},);
}

这样就达到了我们移动widget的目的.
但其实将widget从上向下移动的时候,有一个问题,我再移动一下大家看一下:

相应的打印: 从位置0移动到2.
简单看一下原因:

index widget
0 box1
1 box2
2 box2

我们刚才移动的顺序是将box1移动到box2的后面 , 体现在这里就是从0移动到box2后面,也就是说是移动到了2的位置,因为box2的位置是1嘛. 不知道大家有没有理解.
当然了,如果从起始位置移动到最后,就会出现数组越界的报错:

════════ Exception caught by animation library ═════════════════════════════════════════════════════
The following RangeError was thrown while notifying status listeners for AnimationController:
Invalid value: Not in inclusive range 0..2: 3When the exception was thrown, this was the stack:
#0      List.insert (dart:core-patch/growable_array.dart:11:7)
#1      _MyHomePageState.listWidget.<anonymous closure> (package:flutter_key/home_page.dart:53:17)
#2      SliverReorderableListState._dropCompleted (package:flutter/src/widgets/reorderable_list.dart:646:24)
#3      _DragInfo._dropCompleted (package:flutter/src/widgets/reorderable_list.dart:1163:22)
#4      _DragInfo.startDrag.<anonymous closure> (package:flutter/src/widgets/reorderable_list.dart:1134:9)
...
The AnimationController notifying status listeners was: AnimationController#aca1a(⏮ 0.000; paused; DISPOSED)
════════════════════════════════════════════════════════════════════════════════════════════════════

所以在向下移动的时候,我们要额外处理一下,新的index要减1,之后再进行删除和插入操作:

if(newIndex>oldIndex){newIndex --;
}

横向列表,就是向右的操作要处理

ReorderableListView的缺点

在拖了几下之后,发现了几个缺点:

  • 长按才能触发拖动,容易误触.
  • ReorderableListView仍然是一个Listview,就是说它是会滚动的,当列表很长可以滚动的时候,会有很多误操作.
  • 一维的ListView,我们都知道listview只能在滚动方向来滑动,ReorderableListView也是一样,不能上下左右来回拖动.

其实我们可以通过自己来实现一个这样的组件.
拖动的话,我们可以通过Draggable来实现,它是一个支持拖拽的widget.
为了避免滚动.可以使用ColumnRow.

之后有时间, 会实现一个支持拖动的列表组件,来更好的实现这个效果.

Flutter Key的原理和使用(五) 需要key的实例:可拖动改变顺序的Listview相关推荐

  1. Flutter —— key 的原理

    Flutter -- key 的原理 1. Key 的原理 2. Key 的 探究 3. GlobalKey 之前的文章中有的类故意没有写Key,那么这个Key有什么作用呢?今天来探究一下. 1. K ...

  2. 【Vue】基础系列(五)列表渲染v-for | key的原理 | 数组 | 对象 | 删除替换 | 过滤与排序

    1. 列表显示 v-for指令 用于展示列表数据 语法:v-for="(item, index) in xxx" :key="yyy" 可遍历:数组.对象.字符 ...

  3. 10分钟了解Flutter跨平台运行原理!

    导语 | 本文将从选型.简介和运行原理三大部分为你介绍Flutter的相关概念,希望能站在框架设计和实现原理的高度,带领大家去理解Flutter区别其他跨平台解决方案的关键所在. 一.为什么选择Flu ...

  4. 查看redis缓存大小_一个 bug 引发了服务器崩溃,对应 redis 的 key 回收原理你清楚了吗?...

    1 背景 项目中使用了 redis 做旁路缓存.读请求到来时,有以下操作:1.检查缓存,有则返回2.没有则读取数据库,将结果回写到缓存中. 写请求到来时,有以下操作:1.更新数据库 2.更新缓存(实际 ...

  5. [vue] 你知道vue中key的原理吗?说说你对它的理解

    [vue] 你知道vue中key的原理吗?说说你对它的理解 key的作用主要是为了高效的更新虚拟DOM; 如果没有唯一的key, 数据更新时, 相同节点更新前后无法准确一一对应起来,会导致更新效率降低 ...

  6. java Hashset去重原理及HashMap key唯一原理

    如下,set中添加重复元素是不可以的,如下 php被添加了2次,但是输出的时候只有一次,那么其去重的原理是什么呢? public class Test {public static void main ...

  7. 数据库中五个Key(鍵)的概念区分

    数据库的五个Key: Candidate Keys 候选键 : one or n attributes that can uniquely identify a record. 具有唯一性,最小性. ...

  8. HashpMap的原理,HashMap怎样保证key的唯一性

    HashMap 1.HashMap概述(原理) 2.HashMap的数据结构 3.HashMap的存取 4.扩展问题 前言 如下图我们知道HashMap元素是有序,Key值必须是唯一的,value可以 ...

  9. 杰理的蓝牙芯片的key是什么?以及该如何添加key?杰理key文件原理

    目录 一.简介 关于杰理芯片的key文件,实际上 杰理芯片特有的一种机制,而这种机制就是存在于杰理芯片特有的架构,也是杰理公司延续将近10年的特点,估计以后也会是这种机制.具体为什么,请听我娓娓道来, ...

  10. Zigbee Light Link协议的五种Key

    以下的Key都是用于加解密Transport nwk key数据帧中的nwk key 1 - Development Key Development Key仅在开发阶段使用的key,生产的时候应该被替 ...

最新文章

  1. LintCode: Edit Distance
  2. 互联网金融产品做第三方支付平台托管需要注意什么?
  3. mysql schema table_关于数据库中table与schema的区别详解
  4. Linux的实际操作:文件目录类的实用指令(重定向“>“和追加“>>“)
  5. (40)Gulp中使用BootStrap
  6. 1小时教你学会正则表达式
  7. 80486/486/Intel486 架构/流水线及其优化
  8. Silverlight Telerik控件学习:主题Theme切换
  9. 给公司的电脑配置theano
  10. linux光驱安装内核,Linux的内核管理--之光盘恢复grub的方法
  11. ToolBar控件详解
  12. 体检结果(2018年10月,胃肠镜)
  13. 1.84亿月活换来400亿港元估值,网易云音乐的钱途在哪儿?
  14. 抖音账号都是如何出售的
  15. ThinkPHPdayo01学习笔记(体系化,系统化笔记)
  16. 关于VMware虚拟机中调节图标字体大小
  17. Centos7安装教程2022.2
  18. [机器学习笔记] 将数据拆分成训练集和测试集的几种方法
  19. PTA天梯训练赛一二
  20. GPT系列-1-ChatGPT的理解

热门文章

  1. android 字体显示框架,XUI 一个简洁而又优雅的Android原生UI框架
  2. lua学习03:tolua的编译和使用:C/C++调用lua、lua调用C++、lua调用tolua、常用tolua和lua的API介绍
  3. 在线极限词,敏感词,违禁词查询工具
  4. 用ubantu14.04登录吉大校园网
  5. 本地项目上传至git码云步骤(超详细,附图文)
  6. 将本地项目上传到码云
  7. 在mysql中unique唯一索引的作用_mysql唯一索引和unique
  8. Oracle 官方文档在线查看Oracle函数
  9. 怎样进入金蝶服务器修改参数,金蝶KIS专业版的系统参数在哪里设置
  10. 14届数独-真题标准数独-Day 4-20220119