Flutter表单管理插件reactive_forms_lbc的使用

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

Flutter表单管理插件reactive_forms_lbc的使用

reactive_forms_lbc 是一个为 reactive_forms 包设计的控件集,采用了类似于 bloc 库的监听器/构建器/消费者模式。

可用的控件:

监听器(Listeners)
  • ReactiveFormControlStatusListener
  • ReactiveFormControlFocusListener
  • ReactiveFormControlTouchListener
  • ReactiveFormControlValueListener
构建器(Builders)
  • ReactiveFormControlValueBuilder
  • ReactiveFormControlStatusBuilder
  • ReactiveFormControlTouchBuilder
  • ReactiveFormControlFocusBuilder
消费者(Consumers)
  • ReactiveFormControlValueConsumer
  • ReactiveFormControlStatusConsumer
  • ReactiveFormControlTouchConsumer
  • ReactiveFormControlFocusConsumer

入门指南

运行示例项目以查看其工作原理。

以下是完整的示例代码,展示如何使用 reactive_forms_lbc 插件:

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

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  int _counter = 0;

  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: Column(
            children: [
              MyApp1(
                c: _counter,
              ),
              TextButton(
                onPressed: () {
                  setState(() {
                    _counter++;
                  });
                },
                child: const Text('Increment counter'),
              )
            ],
          ),
        ),
      ),
    );
  }
}

class CitiesService {
  static final List<String> cities = [
    'Beirut',
    'Damascus',
    'San Fransisco',
    'Rome',
    'Los Angeles',
    'Madrid',
    'Bali',
    'Barcelona',
    'Paris',
    'Bucharest',
    'New York City',
    'Philadelphia',
    'Sydney',
  ];

  static List<String> getSuggestions(String query) {
    List<String> matches = <String>[];
    matches.addAll(cities);

    matches.retainWhere((s) => s.toLowerCase().contains(query.toLowerCase()));
    return matches;
  }
}

class MyApp1 extends StatelessWidget {
  final int c;

  const MyApp1({Key? key, required this.c}) : super(key: key);

  FormGroup buildForm() => fb.group({
        'input': FormControl<String>(value: null),
        'input2': FormControl<String>(value: null),
      });

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ReactiveFormBuilder(
      form: buildForm,
      builder: (context, form, child) {
        return Column(
          children: [
            // 创建两个输入框
            ReactiveTextField(
              decoration: const InputDecoration(labelText: 'Input'), // 输入框提示文字
              formControlName: 'input', // 绑定到form中的'input'
            ),
            ReactiveTextField(
              decoration: const InputDecoration(labelText: 'Input2'), // 输入框提示文字
              formControlName: 'input2', // 绑定到form中的'input2'
            ),
            // 使用ReactiveFormControlValueConsumer来显示输入值
            ReactiveFormControlValueConsumer<String>(
              builder: (context, control) {
                return Text(control.value ?? ''); // 显示输入值
              },
              listener: (context, control) {
                // print(control.value); // 可选:打印输入值
              },
              buildWhen: (control, prev, curr) {
                debugPrint('Focus => $prev -- c => $curr'); // 打印调试信息
                return (curr?.length ?? 0) <= 6; // 当输入长度小于等于6时更新
              },
              formControl: form.controls['input']! as FormControl<String>, // 绑定到'input'
            ),
            const SizedBox(height: 16), // 添加间距
            ElevatedButton(
              child: const Text('Disable'), // 按钮文本
              onPressed: () {
                (form.controls['input']! as AbstractControl<String>)
                    .markAsDisabled(); // 禁用输入框
                (form.controls['input']! as AbstractControl<String>)
                    .markAsEnabled(); // 启用输入框
              },
            ),
            ElevatedButton(
              child: const Text('Sign Up'), // 按钮文本
              onPressed: () {
                if (form.valid) { // 如果表单有效
                  // ignore: avoid_print
                  print(form.value); // 打印表单值
                } else {
                  form.markAllAsTouched(); // 标记所有控件已触碰
                }
              },
            ),
          ],
        );
      },
    );
  }
}

更多关于Flutter表单管理插件reactive_forms_lbc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter表单管理插件reactive_forms_lbc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,reactive_forms_lbc 是一个在 Flutter 中用于管理表单状态的强大插件,它基于响应式编程模式。以下是如何在 Flutter 应用中使用 reactive_forms_lbc 的一个简单示例。

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

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

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

以下是一个完整的示例,展示如何使用 reactive_forms_lbc 来管理一个简单的表单:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyFormPage(),
    );
  }
}

class MyFormPage extends StatefulWidget {
  @override
  _MyFormPageState createState() => _MyFormPageState();
}

class _MyFormPageState extends State<MyFormPage> {
  final _formGroup = fb.group({
    'name': ['', Validators.required],
    'email': ['', [Validators.required, Validators.email]],
  });

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Reactive Forms Example'),
      ),
      body: ReactiveFormBuilder(
        formGroup: _formGroup,
        builder: (context, formGroup, meta) {
          return Padding(
            padding: const EdgeInsets.all(16.0),
            child: Column(
              children: [
                ReactiveTextField<String>(
                  formControlName: 'name',
                  decoration: InputDecoration(labelText: 'Name'),
                ),
                ReactiveTextField<String>(
                  formControlName: 'email',
                  decoration: InputDecoration(labelText: 'Email'),
                ),
                SizedBox(height: 16),
                ReactiveFormConsumer(
                  builder: (context, formGroup, meta) {
                    if (formGroup.valid) {
                      return ElevatedButton(
                        onPressed: () {
                          // 处理表单提交
                          print('Form Submitted');
                          print('Name: ${formGroup.control('name').value}');
                          print('Email: ${formGroup.control('email').value}');
                        },
                        child: Text('Submit'),
                      );
                    } else {
                      return ElevatedButton(
                        onPressed: null, // 表单无效时禁用按钮
                        child: Text('Submit (Invalid)'),
                        style: ButtonStyle(
                          backgroundColor: MaterialStateProperty.all(Colors.grey),
                        ),
                      );
                    }
                  },
                ),
              ],
            ),
          );
        },
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 创建表单组:使用 fb.group 创建了一个包含两个字段(nameemail)的表单组,并为每个字段添加了相应的验证器。

  2. 构建表单:使用 ReactiveFormBuilder 包装表单,它接受一个 formGroup 和一个构建函数。在构建函数中,我们使用 ReactiveTextField 来创建表单字段。

  3. 处理表单提交:使用 ReactiveFormConsumer 来根据表单的有效性动态显示或禁用提交按钮。当表单有效时,点击按钮会打印出表单数据;当表单无效时,按钮被禁用。

这个示例展示了如何使用 reactive_forms_lbc 来管理表单状态,包括字段验证和表单提交处理。你可以根据需要扩展这个示例,添加更多的字段和复杂的验证逻辑。

回到顶部