Flutter自定义Widget选择插件widgetpicker的使用

Flutter自定义Widget选择插件widgetpicker的使用

WidgetPicker 是一个基于 NumberPicker 的分支,用于通过相同的用户界面支持分类选择。

示例

以下是一个简单的示例,展示如何使用 WidgetPicker 插件。更多示例可以在 example 中查看。

完整示例代码

import 'package:flutter/material.dart';
import 'package:widgetpicker/widgetpicker.dart';

void main() {
  runApp(new ExampleApp());
}

class ExampleApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'WidgetPicker Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 2,
      child: Scaffold(
        appBar: AppBar(
          title: Text('Widgetpicker example'),
        ),
        body: _WidgetExample(),
      ),
    );
  }
}

class _WidgetExample extends StatefulWidget {
  [@override](/user/override)
  _WidgetExampleState createState() => _WidgetExampleState();
}

class _WidgetExampleState extends State<_WidgetExample> {
  String _currentSelection = "Grape"; // 当前选中的值
  String _currentHorizontalSelection = "Grape"; // 水平方向的当前选中值
  List<String> _options = ["Apple", "Banana", "Grape", "Cherry", "Peach"]; // 可选项列表

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        SizedBox(height: 16), // 空白间距
        Text('默认模式', style: Theme.of(context).textTheme.headline6), // 默认模式标题
        WidgetPicker(
          value: _currentSelection, // 当前选中的值
          options: _options, // 可选项列表
          haptics: true, // 是否启用触觉反馈
          onChanged: (value) => setState(() => _currentSelection = value), // 值改变时更新状态
        ),
        SizedBox(height: 32), // 空白间距
        Row(
          mainAxisAlignment: MainAxisAlignment.center, // 居中对齐
          children: [
            IconButton(
              icon: Icon(Icons.remove), // 减号图标
              onPressed: () => setState(() {
                int index = _options.indexOf(_currentSelection); // 获取当前选中的索引
                if (index > 0) {
                  _currentSelection = _options[index - 1]; // 更新为前一项
                }
              }),
            ),
            Text('当前选择: $_currentSelection'), // 显示当前选中的值
            IconButton(
              icon: Icon(Icons.add), // 加号图标
              onPressed: () => setState(() {
                int index = _options.indexOf(_currentSelection); // 获取当前选中的索引
                if (index < _options.length - 1) {
                  _currentSelection = _options[index + 1]; // 更新为后一项
                }
            }),
          ),
        ),
        Divider(color: Colors.grey, height: 32), // 分割线
        SizedBox(height: 16), // 空白间距
        Text('水平模式', style: Theme.of(context).textTheme.headline6), // 水平模式标题
        WidgetPicker(
          value: _currentHorizontalSelection, // 当前选中的水平值
          options: _options, // 可选项列表
          itemHeight: 100, // 每个选项的高度
          axis: Axis.horizontal, // 设置为水平方向
          onChanged: (value) =>
              setState(() => _currentHorizontalSelection = value), // 值改变时更新状态
          decoration: BoxDecoration( // 装饰器
            borderRadius: BorderRadius.circular(16), // 圆角
            border: Border.all(color: Colors.black26), // 边框
          ),
        ),
        Row(
          mainAxisAlignment: MainAxisAlignment.center, // 居中对齐
          children: [
            IconButton(
              icon: Icon(Icons.remove), // 减号图标
              onPressed: () => setState(() {
                int index = _options.indexOf(_currentSelection); // 获取当前选中的索引
                if (index > 0) {
                  _currentSelection = _options[index - 1]; // 更新为前一项
                }
              }),
            ),
            Text('当前水平选择: $_currentHorizontalSelection'), // 显示当前水平选中的值
            IconButton(
              icon: Icon(Icons.add), // 加号图标
              onPressed: () => setState(() {
                int index = _options.indexOf(_currentSelection); // 获取当前选中的索引
                if (index < _options.length - 1) {
                  _currentSelection = _options[index + 1]; // 更新为后一项
                }
              }),
            ),
          ],
        ),
      ],
    );
  }
}

更多关于Flutter自定义Widget选择插件widgetpicker的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义Widget选择插件widgetpicker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


widgetpicker 是一个用于 Flutter 的自定义 Widget 选择插件,它允许用户从一组预定义的 Widget 中选择一个并将其嵌入到应用中。这个插件特别适用于需要在运行时动态选择 Widget 的场景。

安装 widgetpicker

首先,你需要在 pubspec.yaml 文件中添加 widgetpicker 的依赖:

dependencies:
  flutter:
    sdk: flutter
  widgetpicker: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

使用 widgetpicker

1. 导入包

在你的 Dart 文件中导入 widgetpicker 包:

import 'package:widgetpicker/widgetpicker.dart';

2. 创建 WidgetPicker

WidgetPicker 是一个 StatefulWidget,你可以通过传递一组 Widget 来创建它。用户可以从这组 Widget 中选择一个。

class MyWidgetPicker extends StatefulWidget {
  [@override](/user/override)
  _MyWidgetPickerState createState() => _MyWidgetPickerState();
}

class _MyWidgetPickerState extends State<MyWidgetPicker> {
  Widget? selectedWidget;

  final List<Widget> widgets = [
    Text('Widget 1'),
    Text('Widget 2'),
    Text('Widget 3'),
    // 添加更多 Widget
  ];

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      children: [
        WidgetPicker(
          widgets: widgets,
          onSelected: (Widget widget) {
            setState(() {
              selectedWidget = widget;
            });
          },
        ),
        SizedBox(height: 20),
        if (selectedWidget != null) selectedWidget!,
      ],
    );
  }
}

3. 使用 WidgetPicker

WidgetPicker 中,你可以传递一组 Widget,并在用户选择一个 Widget 时通过 onSelected 回调来更新 UI。

4. 自定义 WidgetPicker

WidgetPicker 提供了多个可自定义的选项,例如:

  • widgets: 要选择的 Widget 列表。
  • onSelected: 当用户选择一个 Widget 时的回调。
  • initialIndex: 初始选择的 Widget 索引。
  • builder: 自定义选择器的外观。
WidgetPicker(
  widgets: widgets,
  onSelected: (Widget widget) {
    setState(() {
      selectedWidget = widget;
    });
  },
  initialIndex: 1,
  builder: (BuildContext context, Widget widget, bool isSelected) {
    return Container(
      padding: EdgeInsets.all(10),
      decoration: BoxDecoration(
        color: isSelected ? Colors.blue : Colors.grey[200],
        borderRadius: BorderRadius.circular(5),
      ),
      child: widget,
    );
  },
)

完整示例

以下是一个完整的示例,展示了如何使用 widgetpicker

import 'package:flutter/material.dart';
import 'package:widgetpicker/widgetpicker.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('WidgetPicker Example')),
        body: MyWidgetPicker(),
      ),
    );
  }
}

class MyWidgetPicker extends StatefulWidget {
  [@override](/user/override)
  _MyWidgetPickerState createState() => _MyWidgetPickerState();
}

class _MyWidgetPickerState extends State<MyWidgetPicker> {
  Widget? selectedWidget;

  final List<Widget> widgets = [
    Text('Widget 1'),
    Text('Widget 2'),
    Text('Widget 3'),
    // 添加更多 Widget
  ];

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      children: [
        WidgetPicker(
          widgets: widgets,
          onSelected: (Widget widget) {
            setState(() {
              selectedWidget = widget;
            });
          },
        ),
        SizedBox(height: 20),
        if (selectedWidget != null) selectedWidget!,
      ],
    );
  }
}
回到顶部