Flutter ListView 拖拽排序了解一下

前面我们对于 ListView 的操作讲过 Flutter 滑动删除最佳实践,那现在我们来了解一下 ListView 的拖拽排序。

效果如下:

ReorderableListView

想要达到如上效果,需使用该类,官网简介:

A list whose items the user can interactively reorder by dragging.

This class is appropriate for views with a small number of children because constructing the List[1] requires doing work for every child that could possibly be displayed in the list view instead of just those children that are actually visible.

All children[2] must have a key.

简单翻译如下:

用户可以通过拖动来重新排序的列表。

该类适用于少量 children 的页面,因为构造列表需要为每一个 children 执行操作,而不只是可见的 children。

所有的 children 都必须有一个 key。

构造函数

按照惯例,查看构造函数:

ReorderableListView({
  this.header,
  @required this.children,
  @required this.onReorder,
  this.scrollDirection = Axis.vertical,
  this.padding,
  this.reverse = false,
}) : assert(scrollDirection != null),
assert(onReorder != null),
assert(children != null),
assert(
  children.every((Widget w) => w.key != null),
  'All children of this widget must have a key.',
);

了解一下各个参数:

•header:是一个不参与拖动排序的 Widget
•children:不用多说,列表项
•onReorder:见名知意,重新排序后的回调
•scrollDirection:方向

剩下两个就不多说了,都应该了解。

简单使用

既然看完了构造函数,那我们就可以分分钟写一个 Demo 出来:

class _ReorderableListViewPageState extends State<ReorderableListViewPage> {
  List<Color> _data = [
    Colors.blue,
    Colors.pinkAccent,
    Colors.deepPurple,
    Colors.orangeAccent
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('ReorderableListViewPage'),
      ),
      body: ReorderableListView(
          header: Container(
            height: 50,
          ),
          children: _data
              .map((s) => Card(
                    color: s,
                    key: Key(s.toString()),
                    child: Container(
                      width: 300,
                      height: 100,
                    ),
                  ))
              .toList(),
          onReorder: (int oldIndex, int newIndex) {
            print("$oldIndex --- $newIndex");
          }),
    );
  }
}

1.首先我们定义好一组颜色的列表
2.然后在 build 方法中返回 ReorderableListView
3.ReorderableListView 中的 children 为用颜色定义好的 Card
4.在 onReorder 回调中打印两个参数 oldIndex & newIndex

运行一下,看一下打印的 log:

可以看到确实是能打印出新旧两个 index, 但是这里有一个很明显的问题,

我们大家都知道数组的下标是从 0 开始,可以看到 第一次是 从 0 到 3,第二次是从 0 到 4,

但是讲道理明明应该是 从 0 到 2,从 0 到 3。

那为什么我前两次移动后的 newIndex 都 +1 了呢?

我们这里也不去深究,

既然我们要移动,那肯定也会对源数据进行操作,不然移动也都是假的。

所以,基于这样的一个 newIndex,我们只需要这样:

setState(() {
  if(oldIndex < newIndex) {
      newIndex -= 1;    
  }

  var temp = _data.removeAt(oldIndex);
  _data.insert(newIndex, temp);
});

1.先判断是向上还是向下拖拽2.如果是向下拖拽,那么 newIndex 会多加一个,我们把它减掉3.然后我们删除旧数据并保存它4.最后在新的 index 上插入

ListView 的拖拽排序和删除

既然前面说到了 ListView 的删除,那这里也必须把它俩组合起来了:

其实代码非常简单,当然这也得益于 Flutter 一切皆 Widget,我们只需要在 Card 上包裹一个 Dismissible 就ok了:

children: _data
  .map((s) => Dismissible(
    key: Key("dismiss $s"),
    child: Card(
      color: s,
      key: Key(s.toString()),
      child: Container(
        width: 300,
        height: 100,
      ),
    ),
  ))
  .toList(),

总结

在 Flutter 当中,我们可以封装很多的 Widget 来为我们日后的开发来节省时间,

当然,也不要忘记 Flutter 当中的 [Widget 测试]

Flutter 上的内存泄漏监控

Flutter 所使用的 Dart 语言具有垃圾回收机制,有垃圾回收就避免不了会内存泄漏。在 Android 平台上有个内存泄漏检测工具 LeakCanary[1], 它可以方便地在 debug 环境下检测当前页面是否泄漏。本文将会带你实现一个 Flutter 可用的 LeakCanary,并讲述怎么用该工具检测出了 1.9.1 Framework 上的两个泄漏。

发布于:4天以前  |  17次阅读  |  详细内容 »

网易支付-高性能NEJFlutter小程序动态化架构实践

大家好,今天跟大家分享的主题是《NEJFlutter小程序动态化高性能架构》,这是关于网易支付团队在Flutter小程序动态化方向上尝试的一套技术解决方案,一句话介绍NEJFlutter,就是用JavaScript开发业务逻辑、Flutter开发UI布局的小程序架构,性能堪比原生Flutter应用;

发布于:16天以前  |  80次阅读  |  详细内容 »

Flutter卡顿问题的监控与思考

使用Flutter技术构建的应用,一直以高性能高流畅度著称。但是随着应用复杂度越来越高,Flutter会出现一些页面流畅度明显低于Native的情况,甚至可能发生一些卡顿。而很多时候卡顿都发生在线上,即使获得了用户的操作路径,也难以重现。如果我们有一套卡顿监控系统,能够帮助我们捕获到卡顿时的堆栈,那么在发生卡顿的时候,我们就可以定位到具体是哪个函数引起的卡顿,从而解决这些问题。

发布于:16天以前  |  74次阅读  |  详细内容 »

​Flutter | 1.9 全新组件 ToggleButtons

前几天的 GDD 相信大家还记忆犹新,Flutter 官宣发布了 1.9 正式版。 随之而来的有一些全新的组件和对于 web 的支持等等。 那我们今天就来看一下这其中的一个组件 --「ToggleButtons」。

发布于:22天以前  |  90次阅读  |  详细内容 »

最多阅读

在Flutter中添加资源和图片 1年以前  |  2308次阅读
Flutter的手势GestureDetector分析详解 1年以前  |  1810次阅读
发布Flutter开发的iOS程序 1年以前  |  1636次阅读
Flutter插件详解及其发布插件 11月以前  |  1608次阅读
Flutter Widget框架概述 1年以前  |  1387次阅读
在Flutter中发起HTTP网络请求 1年以前  |  1362次阅读
使用Inspector检查用户界面 1年以前  |  1325次阅读
JSON和序列化 1年以前  |  1244次阅读
Flutter框架概览 1年以前  |  1197次阅读
Flutter 状态管理指南之 Provider 1年以前  |  1186次阅读
为Flutter应用程序添加交互 1年以前  |  1158次阅读
使用自定义字体 1年以前  |  1148次阅读
Flutter for Web详细介绍 1年以前  |  1088次阅读
处理文本输入 1年以前  |  1047次阅读
Flutter路由详解 1年以前  |  1040次阅读
发布Flutter开发的Android程序 1年以前  |  978次阅读
使用包来开发Flutter应用 1年以前  |  976次阅读
编写国际化Flutter App 1年以前  |  958次阅读