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

1 回复

更多关于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插件提供的更高级和定制化的选择器功能,请参考其官方文档和示例代码,以了解如何根据你的需求进行配置和使用。

回到顶部