Flutter交互式下拉按钮插件reactive_dropdown_button2的使用

Flutter交互式下拉按钮插件reactive_dropdown_button2的使用

reactive_dropdown_button2 是一个用于与 reactive_forms 结合使用的下拉按钮包装器。它基于 dropdown_button2 插件,并提供了更方便的表单集成。

示例代码

import 'package:flutter/material.dart';
import 'package:reactive_dropdown_button2/reactive_dropdown_button2.dart';
import 'package:reactive_forms/reactive_forms.dart';

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

// 定义一个字符串列表作为选项
final List<String> items = [
  'Item1',
  'Item2',
  'Item3',
  'Item4',
  'Item5',
  'Item6',
  'Item7',
  'Item8',
];

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // 构建表单
  FormGroup buildForm() => fb.group({
        'input': FormControl<String>(value: null),
      });

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: Scaffold(
        appBar: AppBar(),
        body: SafeArea(
          child: SingleChildScrollView(
            physics: const BouncingScrollPhysics(),
            padding: const EdgeInsets.symmetric(
              horizontal: 20.0,
              vertical: 20.0,
            ),
            child: ReactiveFormBuilder(
              form: buildForm,
              builder: (context, form, child) {
                return Column(
                  children: [
                    // 使用ReactiveDropdownButton2构建下拉菜单
                    ReactiveDropdownButton2<String>(
                      formControlName: 'input', // 绑定到表单控件
                      items: items
                          .map(
                            (String item) => DropdownMenuItem<String>(
                              value: item,
                              child: Text(item),
                            ),
                          )
                          .toList(), // 将字符串列表转换为DropdownMenuItem列表
                    ),
                    // 提交按钮
                    ElevatedButton(
                      child: const Text('提交'),
                      onPressed: () {
                        if (form.valid) {
                          debugPrint(form.value.toString()); // 打印表单值
                        }
                      },
                    ),
                  ],
                );
              },
            ),
          ),
        ),
      ),
    );
  }
}

代码解释

  1. 导入必要的包:

    import 'package:flutter/material.dart';
    import 'package:reactive_dropdown_button2/reactive_dropdown_button2.dart';
    import 'package:reactive_forms/reactive_forms.dart';
    
  2. 定义字符串列表作为选项:

    final List<String> items = [
      'Item1',
      'Item2',
      'Item3',
      'Item4',
      'Item5',
      'Item6',
      'Item7',
      'Item8',
    ];
    
  3. 构建表单:

    FormGroup buildForm() => fb.group({
          'input': FormControl<String>(value: null),
        });
    
  4. 构建应用主界面:

    [@override](/user/override)
    Widget build(BuildContext context) {
      return MaterialApp(
        theme: ThemeData(
          primarySwatch: Colors.blue,
          visualDensity: VisualDensity.adaptivePlatformDensity,
        ),
        home: Scaffold(
          appBar: AppBar(),
          body: SafeArea(
            child: SingleChildScrollView(
              physics: const BouncingScrollPhysics(),
              padding: const EdgeInsets.symmetric(
                horizontal: 20.0,
                vertical: 20.0,
              ),
              child: ReactiveFormBuilder(
                form: buildForm,
                builder: (context, form, child) {
                  return Column(
                    children: [
                      // 使用ReactiveDropdownButton2构建下拉菜单
                      ReactiveDropdownButton2<String>(
                        formControlName: 'input', // 绑定到表单控件
                        items: items
                            .map(
                              (String item) => DropdownMenuItem<String>(
                                value: item,
                                child: Text(item),
                              ),
                            )
                            .toList(), // 将字符串列表转换为DropdownMenuItem列表
                      ),
                      // 提交按钮
                      ElevatedButton(
                        child: const Text('提交'),
                        onPressed: () {
                          if (form.valid) {
                            debugPrint(form.value.toString()); // 打印表单值
                          }
                        },
                      ),
                    ],
                  );
                },
              ),
            ),
          ),
        ),
      );
    }
    

更多关于Flutter交互式下拉按钮插件reactive_dropdown_button2的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter交互式下拉按钮插件reactive_dropdown_button2的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用reactive_dropdown_button2插件的示例代码。reactive_dropdown_button2是一个交互式下拉按钮插件,非常适合在表单或任何需要用户从列表中选择选项的场景中使用。这个插件与providergetriverpod等状态管理库配合使用效果最佳,但在这里我们将展示一个简单的使用示例。

首先,确保你已经在pubspec.yaml文件中添加了reactive_dropdown_button2依赖:

dependencies:
  flutter:
    sdk: flutter
  reactive_dropdown_button2: ^x.y.z  # 请替换为最新版本号

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

接下来是一个简单的示例代码,展示如何使用reactive_dropdown_button2

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Reactive Dropdown Button 2 Demo'),
        ),
        body: Center(
          child: ReactiveDropdownButton2Demo(),
        ),
      ),
    );
  }
}

class ReactiveDropdownButton2Demo extends StatefulWidget {
  @override
  _ReactiveDropdownButton2DemoState createState() => _ReactiveDropdownButton2DemoState();
}

class _ReactiveDropdownButton2DemoState extends State<ReactiveDropdownButton2Demo> {
  final List<String> options = ['Option 1', 'Option 2', 'Option 3'];
  String? selectedOption;

  @override
  Widget build(BuildContext context) {
    return ReactiveDropdownButton2<String>(
      value: selectedOption,
      data: options,
      onChanged: (newValue) {
        setState(() {
          selectedOption = newValue;
        });
      },
      buttonWidth: 200,
      buttonHeight: 50,
      itemCount: options.length,
      buttonBuilder: (context, state) {
        return Container(
          decoration: BoxDecoration(
            border: Border.all(color: Colors.grey),
            borderRadius: BorderRadius.circular(10),
          ),
          child: Center(
            child: Text(
              selectedOption ?? 'Select an option',
              style: TextStyle(color: Colors.black),
            ),
          ),
        );
      },
      dropdownBuilder: (context, state) {
        return Container(
          decoration: BoxDecoration(
            color: Colors.white,
            borderRadius: BorderRadius.circular(10),
            boxShadow: [
              BoxShadow(
                color: Colors.grey.withOpacity(0.5),
                spreadRadius: 5,
                blurRadius: 7,
                offset: Offset(0, 3), // changes position of shadow
              ),
            ],
          ),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.start,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: options.map<Widget>((String item) {
              return GestureDetector(
                onTap: () {
                  state.didChange(item);
                },
                child: Container(
                  decoration: BoxDecoration(
                    border: Border(
                      bottom: BorderSide(
                        color: state.value == item ? Colors.blueAccent : Colors.transparent,
                      ),
                    ),
                  ),
                  padding: EdgeInsets.symmetric(horizontal: 20.0),
                  child: Text(
                    item,
                    style: TextStyle(
                      color: state.value == item ? Colors.blueAccent : Colors.black,
                    ),
                  ),
                ),
              );
            }).toList(),
          ),
        );
      },
    );
  }
}

在这个示例中:

  • ReactiveDropdownButton2value属性表示当前选中的值。
  • data属性是选项的列表。
  • onChanged回调函数在用户选择新选项时被调用,并更新状态。
  • buttonBuilder用于自定义下拉按钮的UI。
  • dropdownBuilder用于自定义下拉列表项的UI。

你可以根据需要进一步自定义按钮和下拉列表的样式。这个插件非常灵活,允许你通过不同的builder函数来完全控制UI的外观和行为。

回到顶部