Flutter选择框组件插件bs_flutter_selectbox的使用

Flutter选择框组件插件bs_flutter_selectbox的使用

简介

bs_flutter_selectbox 是一个 Flutter 插件,用于创建类似于 Web HTML 的选择框组件,并支持服务器端数据。该插件具有以下特点:

  • 支持服务器端数据的选择框
  • 可搜索的选择框选项
  • 多选模式
  • 自定义选择标签

此插件是 select2 库的最佳替代方案。

开始使用

添加依赖

在 pubspec.yaml 文件中添加 bs_flutter 依赖:

dependencies:
  ...
  bs_flutter: any

创建选择框

导入包

首先,导入 bs_flutter_selectbox 包:

import 'package:bs_flutter_selectbox/bs_flutter_selectbox.dart';

创建控制器

创建一个 BsSelectBoxController 控制器,并初始化选项:

BsSelectBoxController _select1 = BsSelectBoxController(
  options: [
    BsSelectBoxOption(value: 1, text: Text('1')),
    BsSelectBoxOption(value: 2, text: Text('2')),
    BsSelectBoxOption(value: 3, text: Text('3')),
  ]
);

使用选择框

在你的 Flutter 页面中使用 BsSelectBox 组件:

BsSelectBox(
  hintText: 'Pilih salah satu',
  selectBoxController: _select1,
),

自定义样式和大小

你可以通过 style 和 size 属性来自定义选择框的样式和大小。使用 BsSelectBoxSize 和 BsSelectBoxStyle 类来创建自定义样式:

static const BsSelectBoxSize customSize = BsSelectBoxSize(
  fontSize: 14.0,
  optionFontSize: 14.0,
  searchInputFontSize: 14.0,
  labelX: 15.0,
  labelY: 13.0,
  transitionLabelX: -15.0,
  transitionLabelY: 5.0,
  padding: EdgeInsets.only(left: 15.0, right: 15.0, top: 12.0, bottom: 12.0)
);

static const BsSelectBoxStyle outline = BsSelectBoxStyle(
  borderRadius: BorderRadius.all(Radius.circular(5.0))
);

带有提示标签的选择框

使用 hintTextLabel 属性来创建带有提示标签的选择框:

BsSelectBox(
  hintTextLabel: 'Pilih salah satu',
  selectBoxController: _select1,
),

多选模式

要创建一个多选选择框,只需将 multiple 属性设置为 true:

BsSelectBoxController _select2 = BsSelectBoxController(
  multiple: true,
  options: [
    BsSelectBoxOption(value: 1, text: Text('1')),
    BsSelectBoxOption(value: 2, text: Text('2')),
    BsSelectBoxOption(value: 3, text: Text('3')),
    BsSelectBoxOption(value: 4, text: Text('4')),
    BsSelectBoxOption(value: 5, text: Text('5')),
    BsSelectBoxOption(value: 6, text: Text('6')),
  ]
);

BsSelectBox(
  hintText: 'Pilih multiple',
  selectBoxController: _select2,
),

服务器端数据

要创建一个从服务器获取数据的选择框,使用 serverSide 属性并提供一个返回 Future<BsSelectBoxResponse> 的函数:

Future<BsSelectBoxResponse> selectApi(Map<String, String> params) async {
  Uri url = Uri.http('localhost', 'api-json.php', params);
  Response response = await http.get(url);
  if (response.statusCode == 200) {
    List json = convert.jsonDecode(response.body);
    return BsSelectBoxResponse.createFromJson(json);
  }

  return BsSelectBoxResponse(options: []);
}

BsSelectBox(
  hintText: 'Pilih salah satu',
  searchable: true,
  selectBoxController: _select3,
  serverSide: selectApi,
),

示例代码

以下是一个完整的示例代码,展示了如何使用 bs_flutter_selectbox 插件:

import 'package:bs_flutter_buttons/bs_flutter_buttons.dart';
import 'package:bs_flutter_modal/bs_flutter_modal.dart';
import 'package:bs_flutter_responsive/bs_flutter_responsive.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:bs_flutter_selectbox/bs_flutter_selectbox.dart';
import 'package:http/http.dart' as http;
import 'dart:convert' as convert;

void main() {
  runApp(MaterialApp(home: MyApp()));
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  GlobalKey<FormState> _formState = GlobalKey<FormState>();

  BsSelectBoxController _select1 = BsSelectBoxController(options: [
    BsSelectBoxOption(value: 1, text: Text('1')),
    BsSelectBoxOption(value: 2, text: Text('2')),
    BsSelectBoxOption(value: 3, text: Text('3')),
  ]);

  BsSelectBoxController _select2 = BsSelectBoxController(options: [
    BsSelectBoxOption(value: 1, text: Text('1')),
    BsSelectBoxOption(value: 2, text: Text('2')),
    BsSelectBoxOption(value: 3, text: Text('3')),
  ]);

  BsSelectBoxController _select3 = BsSelectBoxController(multiple: true);

  BsSelectBoxController _select4 = BsSelectBoxController();
  BsSelectBoxController _select5 = BsSelectBoxController();

  BsSelectBoxController _select6 = BsSelectBoxController(multiple: true, options: [
    BsSelectBoxOption(value: 1, text: Text('1')),
    BsSelectBoxOption(value: 2, text: Text('2')),
    BsSelectBoxOption(value: 3, text: Text('3')),
    BsSelectBoxOption(value: 4, text: Text('4')),
    BsSelectBoxOption(value: 5, text: Text('5')),
    BsSelectBoxOption(value: 6, text: Text('6')),
  ]);

  @override
  void initState() {
    super.initState();
  }

  Future<BsSelectBoxResponse> selectApi(Map<String, String> params) async {
    Uri url = Uri.http('localhost', 'api-json.php', params);
    Response response = await http.get(url);
    if (response.statusCode == 200) {
      List json = convert.jsonDecode(response.body);
      return BsSelectBoxResponse.createFromJson(json);
    }

    return BsSelectBoxResponse(options: []);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: GestureDetector(
        onTap: () {
          SelectBoxOverlay.removeAll();
        },
        child: Scaffold(
          appBar: AppBar(
            title: Text('Select Box'),
          ),
          body: Scrollbar(
            child: SingleChildScrollView(
              child: Container(
                padding: EdgeInsets.all(20.0),
                child: Form(
                  key: _formState,
                  child: Column(
                    children: [
                      Container(
                        margin: EdgeInsets.only(bottom: 10.0),
                        child: BsSelectBox(
                          hintText: 'Pilih salah satu',
                          controller: _select1,
                          validators: [
                            BsSelectValidators.required
                          ],
                        ),
                      ),
                      Container(
                        margin: EdgeInsets.only(bottom: 10.0),
                        child: BsSelectBox(
                          padding: EdgeInsets.fromLTRB(20.0, 12.0, 20.0, 12.0),
                          hintTextLabel: 'Pilih salah satu',
                          controller: _select2,
                          searchable: true,
                          dialogStyle: BsDialogBoxStyle(
                            borderRadius: BorderRadius.circular(20.0),
                          ),
                          style: BsSelectBoxStyle(
                              backgroundColor: Colors.blueAccent,
                              hintTextColor: Colors.white,
                              selectedColor: Color(0xff3872d1),
                              selectedTextColor: Colors.white,
                              textColor: Colors.white,
                              borderRadius: BorderRadius.circular(50.0),
                              focusedTextColor: Color(0xff3367bd),
                          ),
                          paddingDialog: EdgeInsets.all(15),
                          marginDialog: EdgeInsets.only(top: 5.0, bottom: 5.0),
                        ),
                      ),
                      Container(
                        margin: EdgeInsets.only(bottom: 10.0),
                        child: BsSelectBox(
                          padding: EdgeInsets.fromLTRB(20.0, 12.0, 20.0, 12.0),
                          hintTextLabel: 'Pilih salah satu',
                          controller: _select2,
                          searchable: true,
                          style: BsSelectBoxStyle(
                            backgroundColor: Colors.lightGreen,
                            hintTextColor: Colors.white,
                            selectedColor: Color(0xff608733),
                            selectedTextColor: Colors.white,
                            textColor: Colors.white,
                            focusedTextColor: Color(0xff608733),
                            borderRadius: BorderRadius.circular(50.0),
                          ),
                          dialogStyle: BsDialogBoxStyle(
                            borderRadius: BorderRadius.circular(20.0),
                          ),
                          paddingDialog: EdgeInsets.all(15),
                          marginDialog: EdgeInsets.only(top: 5.0, bottom: 5.0),
                        ),
                      ),
                      Container(
                        margin: EdgeInsets.only(bottom: 10.0),
                        child: BsSelectBox(
                          hintText: 'Pilih multiple',
                          controller: _select3,
                        ),
                      ),
                      Container(
                        margin: EdgeInsets.only(bottom: 10.0),
                        child: BsSelectBox(
                          searchable: true,
                          disabled: true,
                          hintText: 'Pilih salah satu',
                          controller: _select5,
                        ),
                      ),
                      Container(
                        margin: EdgeInsets.only(bottom: 10.0),
                        child: BsSelectBox(
                          hintText: 'Pilih salah satu',
                          searchable: true,
                          controller: _select4,
                          serverSide: selectApi,
                        ),
                      ),
                      Container(
                        margin: EdgeInsets.only(bottom: 10.0),
                        child: BsButton(
                          label: Text('Validate'),
                          prefixIcon: Icons.open_in_new,
                          style: BsButtonStyle.primary,
                          onPressed: () {
                            _formState.currentState!.validate();
                          },
                        ),
                      ),
                      Container(
                        margin: EdgeInsets.only(bottom: 10.0),
                        child: BsButton(
                          label: Text('Set Selected Multiple'),
                          prefixIcon: Icons.open_in_new,
                          style: BsButtonStyle.primary,
                          onPressed: () {
                            _select3.setSelected(BsSelectBoxOption(value: '1', text: Text('Test')));

                            setState(() {
                            });
                          },
                        ),
                      ),
                      BsButton(
                        label: Text('Open Modal'),
                        prefixIcon: Icons.open_in_new,
                        style: BsButtonStyle.primary,
                        onPressed: () {
                          showDialog(
                            context: context,
                            builder: (context) => BsModal(
                              context: context,
                              dialog: BsModalDialog(
                                child: BsModalContent(
                                  children: [
                                    BsModalContainer(title: Text('Modal Select Box'), closeButton: true),
                                    BsModalContainer(child: Column(
                                      children: [
                                        BsCol(
                                          sizes: ColScreen(sm: Col.col_2),
                                          child: BsSelectBox(
                                            hintText: 'Pilih salah satu',
                                            searchable: true,
                                            controller: _select6,
                                            autoClose: false,
                                            alwaysUpdate: false,
                                            serverSide: selectApi,
                                          ),
                                        )
                                      ],
                                    ))
                                  ],
                                ),
                              ),
                            ),
                          );
                        },
                      ),
                      Container(
                        margin: EdgeInsets.only(bottom: 10.0),
                        child: BsSelectBox(
                          margin: EdgeInsets.only(top: 200.0),
                          hintText: 'Pilih salah satu',
                          controller: _select1,
                          validators: [
                            BsSelectValidators.required
                          ],
                        ),
                      ),
                    ],
                  ),
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

以上代码展示了如何使用 bs_flutter_selectbox 插件创建各种类型的选择框,包括单选、多选、带提示标签、服务器端数据等。希望这些示例对你有所帮助!


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

1 回复

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


当然,以下是一个关于如何使用 bs_flutter_selectbox 插件的示例代码。bs_flutter_selectbox 是一个 Flutter 插件,用于在应用中创建选择框组件。假设你已经将 bs_flutter_selectbox 添加到了你的 pubspec.yaml 文件中,并且已经运行了 flutter pub get。

首先,确保你的 pubspec.yaml 文件包含以下依赖项:

dependencies:
  flutter:
    sdk: flutter
  bs_flutter_selectbox: ^最新版本号  # 请替换为实际的最新版本号

然后,你可以在你的 Flutter 应用中使用 bs_flutter_selectbox。以下是一个简单的示例代码,展示如何使用这个插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter SelectBox Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String? selectedValue;

  final List<SelectBoxItem> items = [
    SelectBoxItem(value: '1', text: 'Option 1'),
    SelectBoxItem(value: '2', text: 'Option 2'),
    SelectBoxItem(value: '3', text: 'Option 3'),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter SelectBox Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Selected Value: ${selectedValue ?? 'None'}',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            BSSelectBox(
              items: items,
              value: selectedValue,
              onChanged: (newValue) {
                setState(() {
                  selectedValue = newValue;
                });
              },
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们首先导入了必要的包,包括 flutter/material.dart 和 bs_flutter_selectbox/bs_flutter_selectbox.dart。
  2. 创建了一个简单的 Flutter 应用,其中包含一个 MyApp 和一个 MyHomePage。
  3. 在 MyHomePage 中,我们定义了一个 selectedValue 变量来存储用户的选择。
  4. 创建了一个 items 列表,其中包含了一些 SelectBoxItem,每个 SelectBoxItem 都有一个 value 和一个 text。
  5. 在 build 方法中,我们构建了一个简单的 UI,包含一个显示当前选择值的 Text 组件和一个 BSSelectBox 组件。
  6. 当用户更改选择时,BSSelectBox 的 onChanged 回调会被触发,更新 selectedValue 并重新构建 UI。

这个示例展示了如何使用 bs_flutter_selectbox 插件在 Flutter 应用中创建一个简单的选择框组件。你可以根据自己的需求进一步自定义和扩展这个示例。

回到顶部