怎么使用flutter中Checkbox复选框的全选与删除

技术怎么使用flutter中Checkbox复选框的全选与删除本篇内容介绍了“怎么使用flutter中Checkbox复选框的全选与删除”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大

本文介绍了“如何在flutter中使用Checkbox的完全选择和删除”的知识。很多人在实际案例的操作中会遇到这样的困难。让边肖带领你学习如何处理这些情况。希望大家认真阅读,学点东西!

1.这里主要使用AppBar、Stack、Offstage和Listview等组件。

逻辑是这样的:点击右上角的编辑,弹出每个项目左侧的复选框和底部的操作样式。

然后,您可以全选、取消、单选和删除,并再次单击编辑以隐藏复选框样式。

主要功能分为以下四个模块。顶部导航栏是appbar组件、堆栈覆盖组件、后台显示组件和listview列表组件。

2.让我们初始化数据,设置顶部信息栏的显示效果。

在appbar的右侧设置一个编辑按钮,添加点击事件,并重置选定的id和复选框样式。

appbar的相关功能请参考顶部的导航栏【颤振20个例子之一】。

AppBar(

标题:文本(“我的收藏”),

操作:微件[

图标按钮(

图标:图标(图标.编辑),

Tooltip: '编辑',

onpressed :(){ 0

_ list . foreach((f){ 0

f[' select ']=false;//列表设置为未选中。

});

this . deleteIdS=[];//重置选定的标识数组。

setState((){ 0

这个。_isOff=!这个。_ isOff//隐藏主开关。

这个。_ list=_ list

});

},

),

sp;],
        )

3.listview设置一个可以滚动的列表

当我们点击右上角的编辑时,调出底部的全选和删除操作,但是这个底部样式不随着列表一起滚动

所以我们需要用叠加组件stack将两部分功能包含在一起,同时底部的样式要固定在底部

列表的内容样式可以扩散开发,目前我用颜色条代替

    if (_list.isEmpty) {
      return Center(child: Text('暂无收藏'));
    } else {
      return Container(
        padding: EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 10.0),
        child: Stack(
          alignment: Alignment.bottomCenter,
          children: <Widget>[
            getItemContent(),//这里是列表的内容
            getItemBottom(),//这里是底部删除全选操作的内容
          ],
        ),
      );
    }

4.底部全选和删除的样式

底部有显示隐藏的逻辑,所以用offstage组件包裹,初始化属性为:

offstage: _isOff

默认是隐藏的,点击右上角编辑icon后,_isOff设置为true

同时全选框增加点击事件:

如果为true,遍历_list数组,select设置为true,将数据ID依次加入deleteIds数组

如果为false,遍历_list数组,select设置为false,将清空deleteIds数组

  //底部操作
  Widget getItemBottom() {
    return Offstage(
      offstage: _isOff,
      child: Padding(
        padding: const EdgeInsets.fromLTRB(16, 0, 16, 0),
        child: Container(
            height: 40,
            color: Colors.white,
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                Row(
                  children: <Widget>[
                    Checkbox(
                      value: _checkValue,
                      onChanged: (value) {
                        this.deleteIds = [];
                        _list.forEach((f) {
                          f['select'] = value;
                          if (value == true) {
                            this.deleteIds.add(f['id']);
                          }
                        });
                        setState(() {
                          _checkValue = value;
                          _list = _list;
                        });
                      },
                    ),
                    Text('全选'),
                  ],
                ),
                InkWell(
                  child: Text('删除'),
                  onTap: () {},
                ),
              ],
            )),
      ),
    );
  }

5.中间的内容,左侧放我们的复选框,右侧是列表数据

注意的是:内容里面的复选框padding,要和底部操作条的padding设置一致,看起来是对齐的

内容列表中的复选框点击的时候:

如果状态为true,判断deleteIds数组里是否已经存在本ID,如果没有则进行新增

如果状态为false,删除deleteIds数组里本数据ID

  //底部操作样式
  Widget getItemBottom() {
    return Offstage(
      offstage: _isOff,
      child: Padding(
        padding: const EdgeInsets.fromLTRB(8, 0, 8, 0),
        child: Container(
            height: 40,
            color: Colors.white,
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                Row(
                  children: <Widget>[
                    Checkbox(
                      value: _checkValue,
                      onChanged: (value) {
                        selectAll(value);
                      },
                    ),
                    Text('全选'),
                  ],
                ),
                InkWell(
                  child: Text('删除'),
                  onTap: () {},
                ),
              ],
            )),
      ),
    );
  }

6.整体的主要结构

怎么使用flutter中Checkbox复选框的全选与删除

源码
import 'package:flutter/material.dart';
class Mytest extends StatefulWidget {
  @override
  _MytestState createState() => _MytestState();
}
class _MytestState extends State<Mytest> {
  List<Map> _list = []; //列表
  List<String> deleteIds = []; //要删除的ID数组
  bool _isOff = true; //相关组件显示隐藏控制,true代表隐藏
  bool _checkValue = false; //总的复选框控制开关
  //先初始化一些数据,当然这些数据实际中会调用接口的
  @override
  void initState() {
    super.initState();
    for (var index = 0; index <= 5; index++) {
      Map _temp = {};
      _temp['id'] = index;
      _temp['select'] = false;
      _list.add(_temp);
    }
    setState(() {
      _list = _list;
    });
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('我的收藏'),
          actions: <Widget>[
            IconButton(
              icon: Icon(Icons.edit),
              tooltip: "编辑",
              onPressed: () {
                _list.forEach((f) {
                  f['select'] = false; //列表设置为未选中
                });
                this.deleteIds = []; //重置选中的ID数组
                setState(() {
                  this._isOff = !this._isOff; //显示隐藏总开关
                  this._checkValue = false; //所以复选框设置为未选中
                  this._list = _list;
                });
              },
            ),
          ],
        ), //这个是顶部tab样式,如果不需要可以去掉
        body: Padding(
          padding: const EdgeInsets.all(8.0),
          child: getItem(),
        ));
  }
  //主内容
  Widget getItem() {
    if (_list.isEmpty) {
      return Center(child: Text('暂无收藏'));
    } else {
      return Container(
        padding: EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 10.0),
        child: Stack(
          alignment: Alignment.bottomCenter,
          children: <Widget>[
            getItemContent(), //这里是列表的内容
            getItemBottom(), //这里是底部删除全选操作的内容
          ],
        ),
      );
    }
  }
  //底部操作样式
  Widget getItemBottom() {
    return Offstage(
      offstage: _isOff,
      child: Padding(
        padding: const EdgeInsets.fromLTRB(8, 0, 8, 0),
        child: Container(
            height: 40,
            color: Colors.white,
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                Row(
                  children: <Widget>[
                    Checkbox(
                      value: _checkValue,
                      onChanged: (value) {
                        selectAll(value);
                      },
                    ),
                    Text('全选'),
                  ],
                ),
                InkWell(
                  child: Text('删除'),
                  onTap: () {},
                ),
              ],
            )),
      ),
    );
  }
  //底部复选框的操作逻辑
  selectAll(value) {
    this.deleteIds = []; //要删除的数组ID重置
    _list.forEach((f) {
      f['select'] = value;
      if (value == true) {
        //如果是选中,则将数据ID放入数组
        this.deleteIds.add(f['id'].toString());
      }
    });
    setState(() {
      _checkValue = value;
      _list = _list;
    });
  }
  //列表
  Widget getItemContent() {
    return ListView.builder(
      itemBuilder: (context, index) {
        return _createGridViewItem(_list[index]);
      },
      itemCount: (_list == null) ? 0 : _list.length,
    );
  }
  //单个crad,这里可以自己定义一些样式
  Widget _createGridViewItem(item) {
    Color color = Colors.primaries[item['id']];
    return Padding(
      padding: const EdgeInsets.fromLTRB(8, 5, 8, 5),
      child: Container(
        height: 80,
        color: color,
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: <Widget>[
            Offstage(
              offstage: _isOff,
              child: Checkbox(
                value: item['select'],
                onChanged: (value) {
                  if (value == false) {
                    this.deleteIds.remove(item['id'].toString());
                  } else {
                    this.deleteIds.add(item['id'].toString());
                  }
                  setState(() {
                    item['select'] = value;
                  });
                },
              ),
            ),
            Text('这里放内容'),
          ],
        ),
      ),
    );
  }
}

“怎么使用flutter中Checkbox复选框的全选与删除”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/56382.html

(0)

相关推荐

  • 数据库中with admin option和with grant option怎么用

    技术数据库中with admin option和with grant option怎么用这篇文章主要为大家展示了“数据库中with admin option和with grant option怎么用”,内容简而易懂,条理

    攻略 2021年11月23日
  • 手机软件开发费用,开发一个App的费用是多少

    技术手机软件开发费用,开发一个App的费用是多少首先手机软件开发费用,一个App开发的基本要求,至少需要ios和android两个平台,来满足现在主要的手机平台使用用户,ios和android平台其中任意一个的开发价格大

    生活 2021年10月25日
  • 什么绿什么红,红、白、绿萝卜的主要不同吃法

    技术什么绿什么红,红、白、绿萝卜的主要不同吃法红萝卜炖菜什么绿什么红、做馅、做汤白萝卡做汤绿萝淹咸菜、晒干做咸菜。你好!
    红、白萝卜常用来烧菜、做馅。北方人吃红白萝卜的方法,除了炖萝卜、做馅以外,最多的,是和牛羊肉一块炖

    生活 2021年10月21日
  • 抖音点赞3元100个,抖音刷点赞最低价?

    技术抖音点赞3元100个,抖音刷点赞最低价?抖音点赞量的价钱和你选的平台是不一样的,有些平台点赞100条可能需要15元,有些可能只需要10元,这其中的价格差是很大的,但是点赞量的质量是一样的。
    抖音点赞量的价格是由你购买

    测评 2021年10月22日
  • 字母字符在计算机中的大小比较的依据是什么

    技术字母字符在计算机中的大小比较的依据是什么本篇内容主要讲解“字母字符在计算机中的大小比较的依据是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“字母字符在计算机中的大小比

    攻略 2021年10月25日
  • 怎么写androidinit(android rc文件)

    技术如何进行android启动过程中init.rc文件的浅析本篇文章为大家展示了如何进行android启动过程中init.rc文件的浅析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收

    攻略 2021年12月18日