Flutter选择增强插件selectify的使用
Flutter选择增强插件 selectify
的使用
Selectify
是一个功能强大的 Flutter 库,用于简化选择组件的创建。它支持单选和多选模式,并提供了多种布局选项(如网格、列表和流式布局),以及丰富的样式和行为配置。
主要特性
- 单选和多选支持:灵活配置单选或多选模式。
- 高度可定制:控制每个选择项的布局、样式和交互。
- 多种布局:支持网格、流式布局等,可调整跨轴数量和方向。
- 自定义选择模型:使用提供的
SelectionModel
类或自定义选择模型。 - 支持自定义小部件:通过自定义项构建器扩展功能,创建独特的选择体验。
开始使用
首先,在 pubspec.yaml
文件中添加 selectify
依赖:
dependencies:
selectify: ^1.0.1
然后导入库:
import 'package:selectify/selectify.dart';
使用示例
单选示例
流式布局
在流式布局中,项目会根据屏幕宽度自动调整:
SingleSelection<String>.wrap(
initialValue: items.last,
items: items,
onChanged: (item) {
print('Selected item: $item');
},
),
网格布局
将项目组织成网格,指定每行的项目数量:
SingleSelection<String>.grid(
crossAxisCount: 2, // 每行显示的项目数量
initialValue: items.last,
items: items,
onChanged: (item) {
print('Selected item: $item');
},
),
多选示例
流式布局
启用多选并以单行布局显示:
MultipleSelection<String>.wrap(
initialValue: items.last,
items: items,
onChanged: (items) {
print('Selected items: $items');
},
direction: Axis.horizontal,
),
自定义布局
使用自定义的 SelectionModel
和 itemBuilder
来实现更复杂的布局:
MultipleSelection<SelectionModel<String>>.grid(
crossAxisCount: 2,
items: items,
initialValue: items.take(2).toList(),
onChanged: (items) {
print('Selected items: $items');
},
itemBuilder: (context, item, index, selected) {
return Opacity(
opacity: item.enable ? 1.0 : 0.5,
child: Container(
padding: EdgeInsets.all(8),
decoration: BoxDecoration(
border: Border.all(
color: selected ? Colors.blueAccent : Colors.black54,
),
borderRadius: BorderRadius.circular(10),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
selected ? Icons.check_box : Icons.check_box_outline_blank_outlined,
color: selected ? Colors.blueAccent : Colors.black54,
),
SizedBox(width: 8),
Expanded(
child: Text(item.valueShow ?? item.code),
),
],
),
),
);
},
),
完整示例 Demo
以下是一个完整的示例应用,展示了如何使用 selectify
插件:
import 'package:flutter/material.dart';
import 'package:selectify/selectify.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
useMaterial3: true,
),
home: const MyHomePage(title: 'Selectify Demo Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final List<SelectionModel<String>> items = [
SelectionModel(code: 'A', valueShow: 'Option A', enable: true),
SelectionModel(code: 'B', valueShow: 'Option B', enable: true),
SelectionModel(code: 'C', valueShow: 'Option C', enable: false),
];
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.symmetric(vertical: 20),
child: Text('Single Wrap'),
),
SingleSelection<SelectionModel<String>>.wrap(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
initialValue: items.last,
items: items,
onChanged: (item) {
print('Selected single wrap item: ${item.code}');
},
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 20),
child: Text('Single Grid'),
),
SingleSelection<SelectionModel<String>>.grid(
crossAxisCount: 2,
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
items: items,
initialValue: items[1],
onChanged: (item) {
print('Selected single grid item: ${item.code}');
},
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 20),
child: Text('Multiple Wrap'),
),
MultipleSelection<SelectionModel<String>>.wrap(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
items: items,
initialValue: items.take(2).toList(),
onChanged: (items) {
print('Selected multiple wrap items: ${items.map((e) => e.code)}');
},
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 20),
child: Text('Custom'),
),
MultipleSelection<SelectionModel<String>>.grid(
crossAxisCount: 2,
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
items: items,
initialValue: items.take(2).toList(),
onChanged: (items) {
print('Selected custom items: ${items.map((e) => e.code)}');
},
itemBuilder: (context, item, index, selected) {
return Opacity(
opacity: item.enable ? 1.0 : 0.5,
child: Container(
padding: EdgeInsets.all(8),
decoration: BoxDecoration(
border: Border.all(
color: selected ? Colors.blueAccent : Colors.black54,
),
borderRadius: BorderRadius.circular(10),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
selected
? Icons.check_box
: Icons.check_box_outline_blank_outlined,
color: selected ? Colors.blueAccent : Colors.black54,
),
SizedBox(width: 8),
Expanded(
child: Text(item.valueShow ?? item.code),
),
],
),
),
);
},
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 20),
child: Text('Horizontal Scroll'),
),
MultipleSelection<SelectionModel<String>>.wrap(
direction: Axis.horizontal,
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
items: items,
initialValue: items.take(2).toList(),
onChanged: (items) {
print('Selected horizontal scroll items: ${items.map((e) => e.code)}');
},
),
],
),
),
);
}
}
更多关于Flutter选择增强插件selectify的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter选择增强插件selectify的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用selectify
插件的一个基本示例。selectify
是一个增强版的选择器插件,可以用来替代默认的Flutter选择器,提供更丰富的用户体验。
首先,确保你的Flutter项目已经设置好了,并且你已经在pubspec.yaml
文件中添加了selectify
依赖:
dependencies:
flutter:
sdk: flutter
selectify: ^latest_version # 请替换为最新的版本号
然后运行flutter pub get
来安装依赖。
接下来,在你的Dart文件中使用Selectify
组件。以下是一个简单的示例,展示如何使用Selectify
来创建一个增强版的选择器:
import 'package:flutter/material.dart';
import 'package:selectify/selectify.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Selectify Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final List<String> options = ['Option 1', 'Option 2', 'Option 3', 'Option 4'];
String? selectedValue;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Selectify Example'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Selected Value: ${selectedValue ?? 'None'}',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 20),
Selectify<String>(
options: options,
onChanged: (value) {
setState(() {
selectedValue = value;
});
},
initialValue: selectedValue,
label: 'Select an option',
searchLabel: 'Search...',
noDataFound: 'No data found',
placeholder: 'Select from options',
decoration: InputDecoration(
border: OutlineInputBorder(),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.blueAccent, width: 2.0),
),
),
),
],
),
),
);
}
}
在这个示例中:
- 我们创建了一个简单的Flutter应用,包含一个
Selectify
组件。 options
列表包含了可供选择的选项。selectedValue
存储当前选中的值。Selectify
组件的onChanged
回调会在用户选择一个新选项时被调用,并更新selectedValue
。label
、searchLabel
、noDataFound
和placeholder
属性用于自定义文本显示。decoration
属性用于自定义输入框的外观。
运行这个示例,你将看到一个带有搜索功能的增强版选择器,用户可以从预定义的选项中选择一个值。这个插件提供了灵活的配置选项,可以根据需要进行进一步的自定义。