Flutter选择增强插件selectify的使用

发布于 1周前 作者 sinazl 来自 Flutter

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,
),

自定义布局

使用自定义的 SelectionModelitemBuilder 来实现更复杂的布局:

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

1 回复

更多关于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),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们创建了一个简单的Flutter应用,包含一个Selectify组件。
  2. options列表包含了可供选择的选项。
  3. selectedValue存储当前选中的值。
  4. Selectify组件的onChanged回调会在用户选择一个新选项时被调用,并更新selectedValue
  5. labelsearchLabelnoDataFoundplaceholder属性用于自定义文本显示。
  6. decoration属性用于自定义输入框的外观。

运行这个示例,你将看到一个带有搜索功能的增强版选择器,用户可以从预定义的选项中选择一个值。这个插件提供了灵活的配置选项,可以根据需要进行进一步的自定义。

回到顶部