Flutter选择器插件flutter_selector的使用
Flutter选择器插件flutter_selector的使用
简介
flutter_selector
是一个可定制的 Flutter 选择器插件,允许您自定义界面样式,并支持单选、多选甚至多个列表之间的联动选择。
特性
- 支持自定义UI样式
- 支持单列表选择器
- 支持多列表选择器
- 支持多个列表选择器之间的联动选择
- 支持单列表选择器中的多选功能
预览
开始使用
安装
在您的 pubspec.yaml
文件中添加 flutter_selector
包:
dependencies:
flutter_selector: ^1.0.3
然后运行 flutter pub get
命令来安装包。
使用
初始化
首先需要初始化选择器的参数:
Selector.init(
height: 300, // 设置选择器的高度
radius: 8, // 设置圆角半径
itemExtent: 48, // 设置每个选项的高度
padding: 12, // 设置内边距
textSize: 14, // 设置文字大小
textLeft: '取消', // 左侧按钮的文字
textRight: '确定', // 右侧按钮的文字
textColor: Colors.black54, // 文字颜色
textColorLeft: Colors.black26, // 左侧按钮文字颜色
textColorRight: Colors.black, // 右侧按钮文字颜色
lineColor: Colors.white24, // 分割线颜色
backgroundColor: Colors.grey); // 背景颜色
单选选择器
调用单选选择器:
Selector.showSingleSelector(context,
list: getSingleData(), // 提供数据列表
callBack: (selectorItem, position) { // 回调函数
print('Selected item: $selectorItem at position: $position');
});
双选选择器
调用双选选择器:
Selector.showDoubleSelector(context,
listLeft: getDoubleData()[0], // 左侧列表数据
listRight: getDoubleData()[1], // 右侧列表数据
callBack: (selectorItemLeft, positionLeft, selectorItemRight, positionRight) { // 回调函数
print('Selected item left: $selectorItemLeft at position: $positionLeft');
print('Selected item right: $selectorItemRight at position: $positionRight');
});
多选选择器
调用多选选择器:
Selector.showMultipleSelector(context,
list: getMultipleData(), // 提供数据列表
listPosition: _positions, // 当前选中的位置
callBack: (selectorItems, positions) { // 回调函数
print('Selected items: $selectorItems at positions: $positions');
});
多选带联动的选择器
调用带联动的多选选择器:
Selector.showMultipleLinkSelector(context,
list: getMultipleLinkData(), // 提供数据列表
listPosition: _positionsLink, // 当前选中的位置
callBack: (selectorItems, positions) { // 回调函数
print('Selected items: $selectorItems at positions: $positions');
});
支持多选的单选选择器
调用支持多选的单选选择器:
Selector.showSingleMultipleChoiceSelector(context,
list: getMultipleChoiceData(), // 提供数据列表
callBack: (List<SelectorItem> selectorItems) { // 回调函数
print('Selected items: $selectorItems');
});
示例代码
以下是完整的示例代码,展示了如何使用 flutter_selector
插件:
import 'package:flutter/material.dart';
import 'package:flutter_selector/flutter_selector.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'flutter_selector',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'flutter_selector'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
[@override](/user/override)
void initState() {
super.initState();
Selector.init(textColorRight: Colors.blueAccent);
_selectorItemsMultipleChoice = getMultipleChoiceData();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: body(),
);
}
Widget body() {
StringBuffer buffer = StringBuffer();
for (SelectorItem selectorItem in _selectorItems) {
if (buffer.isEmpty) {
buffer.write(selectorItem.name);
} else {
buffer.write('\n' + selectorItem.name);
}
}
StringBuffer bufferLink = StringBuffer();
for (SelectorItem selectorItem in _selectorItemsLink) {
if (bufferLink.isEmpty) {
bufferLink.write(selectorItem.name);
} else {
bufferLink.write('\n' + selectorItem.name);
}
}
StringBuffer bufferMultipleChoice = StringBuffer();
for (SelectorItem selectorItem in _selectorItemsMultipleChoice) {
if (selectorItem.check) {
if (selectorItem.id.isNotEmpty) {
if (bufferMultipleChoice.isEmpty) {
bufferMultipleChoice.write(selectorItem.name);
} else {
bufferMultipleChoice.write('\n' + selectorItem.name);
}
}
}
}
return Container(
width: double.infinity,
margin: const EdgeInsets.symmetric(horizontal: 16),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const SizedBox(height: 16),
TextButton(
onPressed: _singleSelector,
child: const Text('点击选择器(单)'),
),
Text(_selectorItem?.name ?? ''),
const SizedBox(height: 16),
TextButton(
onPressed: _doubleSelector,
child: const Text('点击选择器(双)'),
),
Text('${_selectorItemLeft?.name ?? ''} ${_selectorItemRight?.name ?? ''}'),
const SizedBox(height: 16),
TextButton(
onPressed: _multipleSelector,
child: const Text('点击选择器(多)'),
),
Text(buffer.toString()),
const SizedBox(height: 16),
TextButton(
onPressed: _multipleLinkSelector,
child: const Text('点击选择器(多,支持联动)'),
),
Text(bufferLink.toString()),
const SizedBox(height: 16),
TextButton(
onPressed: _multipleChoiceSelector,
child: const Text('点击选择器(单,条件多选)'),
),
Text(bufferMultipleChoice.toString()),
],
),
),
);
}
/// ************************* Single Selector ************************* ///
int _position = 0;
SelectorItem? _selectorItem;
void _singleSelector() {
Selector.showSingleSelector(context,
list: getSingleData(),
textColorRight: Colors.black,
position: _position,
callBack: (selectorItem, position) {
_position = position;
_selectorItem = selectorItem;
setState(() {});
});
}
/// ************************* Double selector ************************* ///
int? _positionLeft = 0;
SelectorItem? _selectorItemLeft;
int? _positionRight = 0;
SelectorItem? _selectorItemRight;
void _doubleSelector() {
Selector.showDoubleSelector(context,
listLeft: getDoubleData()[0],
listRight: getDoubleData()[1],
positionLeft: _positionLeft,
positionRight: _positionRight,
callBack: (selectorItemLeft, positionLeft, selectorItemRight, positionRight) {
_positionLeft = positionLeft;
_selectorItemLeft = selectorItemLeft;
_positionRight = positionRight;
_selectorItemRight = selectorItemRight;
setState(() {});
});
}
/// ************************* Multiple Selectors ************************* ///
List<int> _positions = [];
List<SelectorItem> _selectorItems = [];
void _multipleSelector() {
Selector.showMultipleSelector(context,
list: getMultipleData(),
textSize: 12,
listPosition: _positions,
callBack: (selectorItems, positions) {
_positions = positions;
_selectorItems = selectorItems;
setState(() {});
});
}
/// **************** Multiple selectors (support linkage) **************** ///
List<int> _positionsLink = [];
List<SelectorItem> _selectorItemsLink = [];
void _multipleLinkSelector() {
Selector.showMultipleLinkSelector(context,
list: getMultipleLinkData(),
textSize: 12,
listPosition: _positionsLink,
callBack: (selectorItems, positions) {
_positionsLink = positions;
_selectorItemsLink = selectorItems;
setState(() {});
});
}
/// *********** Single selector (conditional multiple selection) *********** ///
List<SelectorItem> _selectorItemsMultipleChoice = [];
void _multipleChoiceSelector() {
Selector.showSingleMultipleChoiceSelector(context,
list: _selectorItemsMultipleChoice,
textSize: 14,
textColor: const Color(0xFF666666),
selectColor: Colors.lightBlueAccent,
describeColor: const Color(0xFF999999),
describeSize: 12,
callBack: (List<SelectorItem> selectorItems) {
_selectorItemsMultipleChoice = selectorItems;
setState(() {});
});
}
/// ***************************** Test Data ***************************** ///
List<SelectorItem> getSingleData() {
List<SelectorItem> list = [];
for (int i = 0; i < 9; i++) {
list.add(SelectorItem(id: '$i', name: '${(i + 1) * 1000} 元'));
}
return list;
}
List<List<SelectorItem>> getDoubleData() {
List<SelectorItem> list1 = [];
for (int i = 0; i < 10; i++) {
if (i == 0) {
list1.add(SelectorItem(id: '${i + 1}', name: '开放式', hideNext: true));
} else {
list1.add(SelectorItem(id: '${i + 1}', name: '$i房'));
}
}
List<SelectorItem> list2 = [];
for (int i = 0; i < 10; i++) {
list2.add(SelectorItem(id: '${i + 1}', name: '$i厅'));
}
return [list1, list2];
}
List<List<SelectorItem>> getMultipleData() {
const int count = 6;
List<SelectorItem> list1 = [];
for (int i = 0; i < count; i++) {
list1.add(SelectorItem(id: '${i + 1}', name: '供应商${i + 1}'));
}
List<SelectorItem> list2 = [];
for (int i = 0; i < count; i++) {
list2.add(SelectorItem(id: '${i + 1}', name: '制造商${i + 1}'));
}
List<SelectorItem> list3 = [];
for (int i = 0; i < count; i++) {
list3.add(SelectorItem(id: '${i + 1}', name: '分销商${i + 1}'));
}
List<SelectorItem> list4 = [];
for (int i = 0; i < count; i++) {
list4.add(SelectorItem(id: '${i + 1}', name: '零售商${i + 1}'));
}
List<SelectorItem> list5 = [];
for (int i = 0; i < count; i++) {
list5.add(SelectorItem(id: '${i + 1}', name: '消费者${i + 1}'));
}
return [list1, list2, list3, list4, list5];
}
List<SelectorItem> getMultipleLinkData() {
const int count = 6;
List<SelectorItem> level1 = [];
for (int i = 0; i < count; i++) {
List<SelectorItem> level2 = [];
for (int j = 0; j < count; j++) {
List<SelectorItem> level3 = [];
for (int k = 0; k < count; k++) {
List<SelectorItem> level4 = [];
for (int m = 0; m < count; m++) {
SelectorItem selectorItem = SelectorItem(id: '${m + 1}', name: '零售商${m + 1}');
level4.add(selectorItem);
}
SelectorItem selectorItem = SelectorItem(
id: '${k + 1}', name: '分销商${k + 1}', childList: level4);
level3.add(selectorItem);
}
SelectorItem selectorItem = SelectorItem(
id: '${j + 1}', name: '制造商${j + 1}', childList: level3);
level2.add(selectorItem);
}
SelectorItem selectorItem =
SelectorItem(id: '${i + 1}', name: '供应商${i + 1}', childList: level2);
level1.add(selectorItem);
}
return level1;
}
List<SelectorItem> getMultipleChoiceData() {
List data = [
{'id': '1', 'name': 'Nike', 'describe': '创新运动品牌,注重性能与时尚'},
{'id': '2', 'name': 'Adidas', 'describe': '三条纹标志,运动与休闲结合'},
{'id': '3', 'name': 'Zara', 'describe': '快时尚,迅速跟进潮流'},
{'id': '4', 'name': 'Gucci', 'describe': '奢华时尚,标志性双G'},
{'id': '5', 'name': 'Prada', 'describe': '意大利奢华,前卫设计'},
{'id': '6', 'name': 'Burberry', 'describe': '英伦经典,标志性格纹'},
{'id': '7', 'name': 'Versace', 'describe': '大胆奢华设计,闪耀魅力'}
];
List<SelectorItem> list = [
SelectorItem(id: '', name: '全选', isCheck: false, isSupportSelectAll: true)
];
for (int i = 0; i < data.length; i++) {
Map map = data[i];
list.add(SelectorItem(
id: map['id'], name: map['name'], describe: map['describe']));
}
return list;
}
}
更多关于Flutter选择器插件flutter_selector的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复