中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用flutter中Checkbox復選框的全選與刪除

發布時間:2021-10-29 15:41:18 來源:億速云 閱讀:421 作者:iii 欄目:編程語言

本篇內容介紹了“怎么使用flutter中Checkbox復選框的全選與刪除”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1.這里主要用到AppBar、Stack、Offstage、Listview等組件

邏輯是這樣的:點擊右上角編輯,調出每條內容左側的復選框,和底部的操作樣式。

然后可以全選,取消,單選,刪除,再次點擊編輯后隱藏復選框樣式

主要功能分為以下四個模塊,頂部導航欄也就是appbar組件、疊加stack組件、顯示隱藏offstage組件、列表listview組件

2.我們先初始化一下數據,設置頂部信息欄的顯示效果

appbar的右側設置一個編輯按鈕,增加點擊事件,重置選中的ID和復選框樣式

appbar的相關功能可以參考初識頂部導航欄【flutter20個實例之一】

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._list = _list;
                });
              },
            ),
          ],
        )

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復選框的全選與刪除”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

昌吉市| 汾阳市| 永寿县| 秦安县| 湖南省| 乐至县| 施甸县| 历史| 肃南| 宜宾市| 东丽区| 北碚区| 九江县| 隆化县| 平顶山市| 随州市| 沽源县| 古丈县| 巨鹿县| 綦江县| 东乡族自治县| 淅川县| 师宗县| 西乡县| 苏尼特右旗| 湟源县| 赫章县| 巩留县| 左权县| 调兵山市| 哈尔滨市| 青州市| 海阳市| 西乌珠穆沁旗| 大悟县| 通城县| 沙洋县| 乐清市| 阜新| 靖西县| 运城市|