Flutter:封装一个自用的bottom_picker选择器

效果图:单列选择器

使用bottom_picker: ^2.9.0实现,单列选择器,官方文档

pubspec.yaml

js 复制代码
# 底部选择
bottom_picker: ^2.9.0

picker_utils.dart

haskell 复制代码
AppTheme:自定义的颜色
TextWidget.body = Text()
<Widget>[].toRow = Row()

下边代码中用到了一些扩展,需要自行替换这些内容

js 复制代码
import 'package:bottom_picker/bottom_picker.dart';
import 'package:ducafe_ui_core/ducafe_ui_core.dart';
import 'package:flutter/material.dart';
import 'package:xiaoshukeji/common/index.dart';

class PickerUtils {
  /// 底部单列选择器
  /// [context] 上下文
  /// [title] 选择器标题
  /// [items] 数据列表 [{'id': 1, 'name': '选项1'}]
  /// [onConfirm] 确认回调 返回选中项
  static void showPicker({
    required BuildContext context,
    required String title,
    required List<Map<String, dynamic>> items,
    required Function(Map<String, dynamic>) onConfirm,
  }) {
    BottomPicker(
      pickerTitle: TextWidget.body(
        title,
        weight: FontWeight.w600,
        size: 30.sp,
      ),
      items: items.map((item) => 
        Center(
          child: TextWidget.body(
            item['name'].toString(),
            size: 28.sp,
          ),
        ),
      ).toList(),
      buttonPadding: 0,
      buttonWidth: 690.w,
      titleAlignment: Alignment.center,
      backgroundColor: AppTheme.blockBgColor,
      pickerTextStyle: TextStyle(
        fontSize: 28.sp,
        color: AppTheme.textColorfff,
      ),
      closeIconColor: AppTheme.textColorfff,
      buttonAlignment: MainAxisAlignment.center,
      displaySubmitButton: true,
      buttonContent: <Widget>[
        TextWidget.body(
          '确定',
          weight: FontWeight.w600,
          size: 26.sp,
        ),
      ].toRow(
        mainAxisAlignment: MainAxisAlignment.center
      ).card(
        color: AppTheme.primaryYellow
      ).tight(
        height: 80.w,
      ),
      buttonStyle: BoxDecoration(
        color: Colors.transparent,
        borderRadius: BorderRadius.circular(44.w),
      ),
      onSubmit: (index) {
        onConfirm(items[index]);
      },
    ).show(context);
  }
}

使用

js 复制代码
// 记得import  PickerUtils 文件

// 模型列表数据,默认接口返回了id和name字段
final List<Map<String, dynamic>> modelList = [
  {'id': 1, 'name': '模型1'},
  {'id': 2, 'name': '模型2'},
  {'id': 3, 'name': '模型3'},
];

// 选择
void showModelPicker(BuildContext context) {
  PickerUtils.showPicker(
    context: context,
    title: '选择模型',
    items: modelList,
    onConfirm: (selected) {
      modelController.text = selected['name'];
      update(['strategy_add']);
    },
  );
}

// 页面中调用
onTap((){
  controller.showPairPicker(context);
}),
相关推荐
月光下的丝瓜1 天前
Flutter 国内安装指南
前端·flutter
恋猫de小郭3 天前
Amper 正式转正 Kotlin Toolchain ,Gradle 未来何去何从
android·前端·flutter
张风捷特烈4 天前
Flutter 类库大揭秘#02 | path_provider 各平台实现
前端·flutter
TT_Close4 天前
别劝退了!5秒搞定 Flutter 鸿蒙 FVM 起跑线
flutter·harmonyos·visual studio code
你听得到115 天前
用户说 App 卡,但说不清在哪?我把 Flutter 监控 SDK 升级成了链路观测工作台
前端·flutter·性能优化
stringwu6 天前
Flutter 开发必备:MVI 架构的高效实现指南
前端·flutter
程序员老刘7 天前
Flutter版本选择指南:3.44系列继续观望 | 2026年6月
flutter·ai编程·客户端
用户965597361908 天前
Provider vs Bloc vs GetX vs Riverpod:Flutter 状态管理方案怎么选?
flutter
恋猫de小郭8 天前
Flutter Patchwork,不用 Fork 改依赖包源码的第三方工具
android·前端·flutter
程序员老刘9 天前
跑分第一的编程大模型,我为啥不用?
flutter·ai编程·vibecoding