本文介绍了“如何在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.整体的主要结构

源码
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
