Flutter自定义选择器插件custom_picker的使用
Flutter 自定义选择器插件 custom_picker 的使用
custom_picker
是一个 Flutter 包,它为您提供了一个美化版的下拉框小部件。在大小、颜色、样式等方面具有高度可定制性。
导入
在 pubspec.yaml
文件中添加以下依赖:
dependencies:
custom_picker: <latest_version>
输出
使用
您可以使用多种文本美化选项与检测到的文本格式一起使用。
CustomPicker(
// 决定是否循环显示弹出项
optionLoop: [false, false],
// 设置弹出窗口的高度
popupHeight: 200,
// 弹出菜单的位置
below: false,
// 垂直偏移量
verticalOffset: 10,
// 处理所有更改
handleChange: (list) {
print(list);
},
// 是否包括确认/取消对话框
yesNo: true,
// 设置选中项目的颜色
popUpSelColor: Colors.black.withAlpha(150),
// 定制每个弹出列表项的文本样式
popUpTextStyle: const [
TextStyle(color: Colors.white, fontSize: 20),
TextStyle(color: Colors.white, fontSize: 20),
],
// 定制每个列表项的文本样式
widTextStyle: const [
TextStyle(color: Colors.black, fontSize: 18),
TextStyle(color: Colors.black, fontSize: 18),
],
// 定制分割线的颜色
divColor: Colors.black,
// 给弹出菜单添加装饰
popUpDecoration: BoxDecoration(
color: Colors.black.withAlpha(100),
borderRadius: BorderRadius.circular(10)),
// 装饰您的选择器小部件
widDecoration: BoxDecoration(
border: Border.all(width: 2, color: Colors.black),
borderRadius: BorderRadius.circular(10),
),
// 输入您想要在弹出菜单中显示的所有列表项
list: const [
['1', '2', '3', '4', '5', '6'],
['one', 'two', 'three']
],
// 控制可见小部件子项的 flex 属性
wtList: [3, 1],
// 当选择 Yes/No 对话框中的选项时调用的回调函数
onChanged: (List<int> value) {
print(value);
},
// 设置初始选中的项目索引
selected: const [0, 1],
)
参数
以下是 CustomPicker
的参数说明:
参数名称 | 描述 | 默认值 |
---|---|---|
popupHeight | 弹出窗口的高度 | 400 |
optionLoop | 列表是否循环 | 所有为 true |
below | 是否在小部件下方显示弹出窗口 | false |
popUpDecoration | 弹出窗口的装饰 | radius: 10, border: Color(0xFF424242) |
verticalOffset | 弹出窗口的垂直位置 | TextAlign.start |
selected | 初始选中的列表 | required |
yesNo | 是否显示确认/取消对话框 | false |
popUpTextStyle | 添加弹出窗口项的文本样式 | TextStyle(fontSize: 17) |
widTextStyle | 添加选择器项的文本样式 | TextStyle() |
onChanged | 每当当前日期发生变化时调用 | required |
handleChange | 当任何子项发生变化时调用此方法 | void |
popUpMargin | 弹出窗口的边距(如果为零,则弹出窗口将位于选择器中心) | hor = 20, ver = 20 |
onCancel | 用户取消更改日期时调用 | void |
list | 要在弹出窗口中显示的选项列表 | required |
wtList | 可见小部件项的 flex 属性 | 每个子项相等 |
contentPadding | 选择器小部件的填充 | 零 |
widDecoration | 可见小部件的装饰 | BoxDecoration() |
childDecoration | 可见小部件子项的装饰 | 默认文本样式 |
widHeight | 可见小部件的高度 | 40 |
divColor | 可见小部件的分隔线颜色 | Color(0xFF424242) |
popUpSelColor | 弹出窗口选中项的颜色 | Colors.white |
示例代码
import 'package:custom_picker/custom_picker.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
var opt = [5, 17, 41];
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
CustomPicker(
// 决定是否循环显示弹出项
optionLoop: [false, false, false],
// 设置弹出窗口的高度
popupHeight: 500,
// 弹出菜单的位置
below: false,
// 垂直偏移量
verticalOffset: 10,
// 处理所有更改
handleChange: (list) {
print(list);
},
// 是否包括确认/取消对话框
yesNo: true,
// 设置选中项目的颜色
popUpSelColor: Colors.black.withAlpha(50),
// 定制每个弹出列表项的文本样式
popUpTextStyle: [
TextStyle(color: Colors.grey.shade600, fontSize: 18),
TextStyle(color: Colors.grey.shade600, fontSize: 18),
TextStyle(color: Colors.grey.shade600, fontSize: 18),
],
// 定制每个列表项的文本样式
widTextStyle: [
TextStyle(color: Colors.black.withAlpha(120), fontSize: 18),
TextStyle(color: Colors.black.withAlpha(120), fontSize: 18),
TextStyle(color: Colors.black.withAlpha(120), fontSize: 18),
],
// 定制分割线的颜色
divColor: Colors.grey.shade200,
// 添加填充
contentPadding: const EdgeInsets.all(7),
// 给弹出菜单添加装饰
popUpDecoration: BoxDecoration(
color: Colors.white,
border: Border.all(width: 2, color: Colors.white),
boxShadow: [
BoxShadow(
color: const Color(0x33000000).withAlpha(50),
offset: Offset(2, 4),
blurRadius: 7,
),
],
borderRadius: BorderRadius.circular(10)),
// 装饰您的选择器小部件
widDecoration: BoxDecoration(
color: Colors.white,
boxShadow: [
BoxShadow(
color: const Color(0x33000000).withAlpha(50),
offset: Offset(2, 4),
blurRadius: 7,
),
],
borderRadius: BorderRadius.circular(20),
),
// 输入您想要在弹出菜单中显示的所有列表项
list: [
[
'Jan',
'Feb',
'Mar',
'Apr',
'May',
'Jun',
'Jul',
'Aug',
'Sep',
'Oct',
'Nov',
'Dec'
],
List.generate(31, (index) => '${index + 1}').toList(),
List.generate(50, (index) => '${index + 1980}').toList(),
],
// 控制可见小部件子项的 flex 属性
wtList: [3, 1, 2],
// 当选择 Yes/No 对话框中的选项时调用的回调函数
onChanged: (List<int> value) {
opt = value;
setState(() {});
},
// 设置初始选中的项目索引
selected: opt,
),
SizedBox(height: 100),
],
),
),
);
}
}
更多关于Flutter自定义选择器插件custom_picker的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter自定义选择器插件custom_picker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter中使用custom_picker
插件的示例代码。这个插件允许你创建自定义的选择器,比如日期选择器、时间选择器或自定义的选项选择器。
首先,确保你已经在pubspec.yaml
文件中添加了custom_picker
依赖:
dependencies:
flutter:
sdk: flutter
custom_picker: ^x.y.z # 替换为最新的版本号
然后,运行flutter pub get
来安装依赖。
接下来,这里有一个简单的示例,展示如何使用custom_picker
来创建一个基本的日期选择器:
import 'package:flutter/material.dart';
import 'package:custom_picker/custom_picker.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Custom Picker Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
DateTime selectedDate;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Custom Picker Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
selectedDate == null
? 'No date selected'
: 'Selected Date: ${selectedDate.toLocal()}',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
_showDatePicker(context);
},
child: Text('Select Date'),
),
],
),
),
);
}
Future<void> _showDatePicker(BuildContext context) async {
final DateTime picked = await showDatePicker(
context: context,
initialDate: selectedDate ?? DateTime.now(),
firstDate: DateTime(2000),
lastDate: DateTime(2101),
builder: (BuildContext context, Widget? child) {
return Theme(
data: ThemeData.light().copyWith(
colorScheme: ColorScheme.fromSwatch(
primarySwatch: Colors.blue,
).copyWith(
background: Colors.white,
),
dialogBackgroundColor: Colors.white,
),
child: child!,
);
},
);
if (picked != null && picked != selectedDate) {
setState(() {
selectedDate = picked;
});
}
}
// 这是一个自定义选择器的示例,假设我们有一个简单的字符串列表选择器
Future<void> _showCustomPicker(BuildContext context) async {
final List<String> options = ['Option 1', 'Option 2', 'Option 3'];
final String? result = await showDialog<String>(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Select an Option'),
content: SingleChildScrollView(
child: ListBody(
children: ListTile.divideTiles(
context: context,
tiles: options.map<Widget>((String option) {
return ListTile(
title: Text(option),
onTap: () {
Navigator.of(context).pop(option);
},
);
}).toList(),
),
),
),
actions: <Widget>[
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text('Cancel'),
),
TextButton(
onPressed: () {
// 通常这里不会直接pop,因为用户还没选择,但为了示例简化处理
Navigator.of(context).pop('Default Selected'); // 示例中不会用到这行
},
child: Text('OK'),
),
],
);
},
);
// 注意:这个简单的自定义选择器示例并没有实际返回用户选择的值,
// 你需要根据你的需求调整这部分代码以正确处理用户的选择。
// 在实际应用中,你可能需要使用 StatefulBuilder 或其他方法来更新 UI。
// 下面的代码仅作为示例,实际上并不会更新任何状态。
if (result != null) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("You selected: $result")),
);
}
}
}
注意:上面的_showCustomPicker
函数提供了一个非常基础的自定义选择器对话框示例,但它并没有实际返回用户选择的值(因为示例代码简化了处理)。在实际应用中,你需要使用如StatefulBuilder
等方法来处理用户的选择并更新UI状态。
对于custom_picker
插件提供的更高级和定制化的选择器功能,请参考其官方文档和示例代码,以了解如何根据你的需求进行配置和使用。