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

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

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

自定义样式和大小

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

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.dartbs_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. 当用户更改选择时,BSSelectBoxonChanged 回调会被触发,更新 selectedValue 并重新构建 UI。

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

回到顶部