Flutter自定义响应式文本字段插件custom_reactive_text_field的使用

Flutter 自定义响应式文本字段插件 custom_reactive_text_field 的使用

特性

这是一个名为 CustomTextFormField 的自定义组件。它可以在 ReactForms 中用于表单验证。它支持所有 TextFormField 的功能,并且具有更强大的验证器。

开始前的准备工作

pubspec.yaml 文件中添加依赖:

dependencies:
  custom_reactive_text_field: 1.0.0

然后导入包:

import 'package:custom_reactive_text_field/custom_reactive_text_field.dart';

使用方法

下面是一个简单的示例,展示了如何在应用中使用 CustomTextFormField 组件:

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

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

class MyApp extends StatelessWidget {
  // 这个小部件是你的应用的根节点。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '自定义文本字段示例',
      theme: ThemeData(
        primarySwatch: Colors.orange,
        visualDensity: VisualDensity.comfortable,
      ),
      home: MyHomePage(title: 'CustomTextFormField 示例'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final String title;
  const MyHomePage({required this.title, super.key});

  [@override](/user/override)
  MyHomePageState createState() => MyHomePageState();
}

class MyHomePageState extends State<MyHomePage> {
  String nameKey = 'name';
  String fatherNameKey = 'fatherName';
  String mobileNumberKey = 'mobileNumber';

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: SingleChildScrollView(
        child: ReactiveFormBuilder(
            form: buildForm,
            builder: (context, form, child) {
              return Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    SizedBox(height: 48),
                    CustomTextFormField(
                      label: '姓名',
                      formControlName: nameKey,
                      isRequired: true,
                    ),
                    CustomTextFormField(
                      label: '父亲姓名',
                      formControlName: fatherNameKey,
                      isRequired: true,
                    ),
                    CustomTextFormField(
                      label: '手机号码',
                      formControlName: mobileNumberKey,
                      maxLength: 10,
                      isRequired: true,
                    ),
                    ElevatedButton(
                        onPressed: () {
                          if (form.valid) {
                            ScaffoldMessenger.of(context).showSnackBar(SnackBar(
                                content: Text('Yay! 表单已提交')));
                          } else {
                            ScaffoldMessenger.of(context).showSnackBar(SnackBar(
                                content: Text('Oops! 请填写必填项')));
                          }
                        },
                        child: Text('提交')),
                  ],
                ),
              );
            }),
      ), // 这个逗号使自动格式化更好看。
    );
  }

  FormGroup buildForm() => fb.group(<String, Object>{
        nameKey: FormControl<String>(value: '', validators: [
          Validators.required,
          Validators.minLength(2),
          Validators.maxLength(128)
        ]),
        fatherNameKey: FormControl<String>(value: null, validators: [Validators.required]),
        mobileNumberKey: FormControl<String>(value: '', validators: [
          Validators.required,
          Validators.minLength(10),
          Validators.maxLength(10)
        ])
      });
}

更多关于Flutter自定义响应式文本字段插件custom_reactive_text_field的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义响应式文本字段插件custom_reactive_text_field的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


custom_reactive_text_field 是一个自定义的 Flutter 插件,用于创建响应式文本字段。它通常用于在表单中处理用户输入,并且可以根据某些条件动态地更新文本字段的状态。下面是如何使用 custom_reactive_text_field 插件的详细步骤。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 custom_reactive_text_field 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  custom_reactive_text_field: ^1.0.0  # 请确保使用最新版本

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

2. 导入插件

在你的 Dart 文件中导入 custom_reactive_text_field 插件。

import 'package:custom_reactive_text_field/custom_reactive_text_field.dart';

3. 使用 CustomReactiveTextField

CustomReactiveTextField 是一个响应式文本字段,可以根据某些条件动态地更新其状态。你可以像使用普通的 TextField 一样使用它,但它还提供了一些额外的功能,比如根据条件动态更新样式、验证等。

基本用法

class MyForm extends StatelessWidget {
  final _formKey = GlobalKey<FormState>();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Column(
        children: [
          CustomReactiveTextField(
            decoration: InputDecoration(labelText: 'Enter your name'),
            onChanged: (value) {
              print('Name: $value');
            },
            validator: (value) {
              if (value == null || value.isEmpty) {
                return 'Please enter your name';
              }
              return null;
            },
          ),
          ElevatedButton(
            onPressed: () {
              if (_formKey.currentState!.validate()) {
                // Form is valid, proceed with further actions
              }
            },
            child: Text('Submit'),
          ),
        ],
      ),
    );
  }
}

动态更新样式

你可以根据某些条件动态地更新文本字段的样式。例如,当用户输入的内容不符合要求时,可以改变文本字段的颜色。

CustomReactiveTextField(
  decoration: InputDecoration(labelText: 'Enter your email'),
  onChanged: (value) {
    print('Email: $value');
  },
  validator: (value) {
    if (value == null || !value.contains('@')) {
      return 'Please enter a valid email';
    }
    return null;
  },
  reactiveCondition: (value) {
    return value != null && !value.contains('@');
  },
  reactiveDecoration: (isReactive) {
    return InputDecoration(
      labelText: 'Enter your email',
      labelStyle: TextStyle(color: isReactive ? Colors.red : Colors.black),
    );
  },
),

自定义响应逻辑

你可以通过 reactiveConditionreactiveDecoration 自定义响应逻辑和样式。

CustomReactiveTextField(
  decoration: InputDecoration(labelText: 'Enter your password'),
  onChanged: (value) {
    print('Password: $value');
  },
  validator: (value) {
    if (value == null || value.length < 6) {
      return 'Password must be at least 6 characters';
    }
    return null;
  },
  reactiveCondition: (value) {
    return value != null && value.length < 6;
  },
  reactiveDecoration: (isReactive) {
    return InputDecoration(
      labelText: 'Enter your password',
      labelStyle: TextStyle(color: isReactive ? Colors.red : Colors.black),
      errorText: isReactive ? 'Password is too short' : null,
    );
  },
),

4. 处理表单提交

你可以在表单提交时使用 Formvalidate 方法来验证所有字段,并根据验证结果执行相应的操作。

ElevatedButton(
  onPressed: () {
    if (_formKey.currentState!.validate()) {
      // Form is valid, proceed with further actions
    }
  },
  child: Text('Submit'),
),

5. 完整示例

以下是一个完整的示例,展示了如何使用 CustomReactiveTextField 创建一个简单的表单。

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

class MyForm extends StatelessWidget {
  final _formKey = GlobalKey<FormState>();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Custom Reactive TextField Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            children: [
              CustomReactiveTextField(
                decoration: InputDecoration(labelText: 'Enter your name'),
                onChanged: (value) {
                  print('Name: $value');
                },
                validator: (value) {
                  if (value == null || value.isEmpty) {
                    return 'Please enter your name';
                  }
                  return null;
                },
              ),
              CustomReactiveTextField(
                decoration: InputDecoration(labelText: 'Enter your email'),
                onChanged: (value) {
                  print('Email: $value');
                },
                validator: (value) {
                  if (value == null || !value.contains('@')) {
                    return 'Please enter a valid email';
                  }
                  return null;
                },
                reactiveCondition: (value) {
                  return value != null && !value.contains('@');
                },
                reactiveDecoration: (isReactive) {
                  return InputDecoration(
                    labelText: 'Enter your email',
                    labelStyle: TextStyle(color: isReactive ? Colors.red : Colors.black),
                  );
                },
              ),
              CustomReactiveTextField(
                decoration: InputDecoration(labelText: 'Enter your password'),
                onChanged: (value) {
                  print('Password: $value');
                },
                validator: (value) {
                  if (value == null || value.length < 6) {
                    return 'Password must be at least 6 characters';
                  }
                  return null;
                },
                reactiveCondition: (value) {
                  return value != null && value.length < 6;
                },
                reactiveDecoration: (isReactive) {
                  return InputDecoration(
                    labelText: 'Enter your password',
                    labelStyle: TextStyle(color: isReactive ? Colors.red : Colors.black),
                    errorText: isReactive ? 'Password is too short' : null,
                  );
                },
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () {
                  if (_formKey.currentState!.validate()) {
                    // Form is valid, proceed with further actions
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(content: Text('Form Submitted Successfully')),
                    );
                  }
                },
                child: Text('Submit'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

void main() {
  runApp(MaterialApp(
    home: MyForm(),
  ));
}
回到顶部