Flutter表单管理插件form_controller的使用
Flutter表单管理插件form_controller的使用
form_controller
是一个用于组合多个 TextEditingController
并管理表单状态的控制器。它可以帮助开发者更方便地处理表单输入、验证和重置。
开始使用
1. 添加依赖
在项目的 pubspec.yaml
文件中添加 form_controller
:
dependencies:
form_controller: [latest version]
然后运行以下命令安装依赖:
$ flutter pub get
2. 导入库
在需要使用的 Dart 文件中导入 form_controller
:
import 'package:form_controller/form_controller.dart';
示例代码
以下是一个完整的示例,展示如何使用 form_controller
来管理表单。
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:form_controller/form_controller.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter FormController Demo',
home: Example(),
);
}
}
class Example extends StatefulWidget {
@override
_ExampleState createState() => _ExampleState();
}
class _ExampleState extends State<Example> {
// 声明并初始化 FormController
late FormController _formController;
@override
void initState() {
super.initState();
_formController = FormController(controllers: ['val1', 'val2', 'val3']);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Form(
// 使用 FormController 提供的 key
key: _formController.key,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
// 字段1
const Text("field1"),
TextFormField(
controller: _formController.controller("val1"),
),
// 字段2
const Text("field2"),
TextFormField(
// 可以通过 key 实现特定字段的验证
key: _formController.fieldStateKey("val2"),
controller: _formController.controller("val2"),
),
// 字段3
const Text("field3"),
TextFormField(
// 设置初始文本
controller: _formController.controller("val3", initialText: "Initial Text!"),
),
// 字段4(带验证)
const Text("field4"),
TextFormField(
controller: _formController.controller("val4"),
// 自定义验证规则
validator: FormControllerValidators.validate([
FormControllerValidators.isRequired(),
FormControllerValidators.minLength(10),
]),
),
// 获取数据按钮
MaterialButton(
onPressed: () {
// 获取字段值
debugPrint("Con1: " + _formController.value("val1"));
debugPrint("Con2: " + _formController.value("val2"));
debugPrint("Con3: " + _formController.value("val3"));
// 调用表单状态方法
_formController.reset(); // 重置表单
_formController.validate(); // 验证表单
_formController.save(); // 保存表单数据
},
child: const Text("Get data!"),
),
// 设置字段值
MaterialButton(
onPressed: () {
_formController.set('val2', "This is the new text!");
},
child: const Text("Set V2 data!"),
),
// 单独验证某个字段
MaterialButton(
onPressed: () {
_formController.validateOnly("val2");
},
child: const Text("Validate V2 data!"),
),
// 字段值流
StreamBuilder<String>(
stream: _formController.valueStream("val1"),
builder: (context, snapshot) {
return Text("Stream of V1: ${snapshot.data}");
},
),
// 控制字段的隐藏状态
Row(
children: [
TextFormField(
controller: _formController.controller("val5", isObscure: true),
),
MaterialButton(
onPressed: () {
_formController.toggleObscurity('val5');
},
child: Icon(Icons.remove_red_eye),
),
],
),
],
),
),
);
}
}
// 在使用完成后释放资源
@override
void dispose() async {
await _formController.dispose();
super.dispose();
}
功能详解
-
初始化控制器
使用FormController
初始化表单,并传入需要管理的控制器列表。late FormController _formController; _formController = FormController(controllers: ['val1', 'val2', 'val3']);
-
获取表单控件
使用controller
方法获取指定 ID 的TextEditingController
。TextFormField( controller: _formController.controller("val1"), )
-
设置初始值
可以通过initialText
参数为控制器设置初始值。TextFormField( controller: _formController.controller("val3", initialText: "Initial Text!"), )
-
验证字段
支持自定义验证规则,例如必填项和最小长度。validator: FormControllerValidators.validate([ FormControllerValidators.isRequired(), FormControllerValidators.minLength(10), ])
-
控制字段状态
可以通过toggleObscurity
方法切换密码框的隐藏状态。MaterialButton( onPressed: () { _formController.toggleObscurity('val5'); }, child: Icon(Icons.remove_red_eye), )
-
监听字段变化
使用valueStream
监听字段的变化。StreamBuilder<String>( stream: _formController.valueStream("val1"), builder: (context, snapshot) { return Text("Stream of V1: ${snapshot.data}"); }, )
-
重置表单
使用reset
方法清空所有字段。_formController.reset();
-
保存表单数据
使用save
方法保存表单数据。_formController.save();
-
单独验证字段
使用validateOnly
方法单独验证某个字段。_formController.validateOnly("val2");
更多关于Flutter表单管理插件form_controller的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter表单管理插件form_controller的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
form_controller
是一个用于简化 Flutter 表单管理的插件。它提供了一种更简洁的方式来处理表单的验证、提交和状态管理。以下是如何使用 form_controller
插件的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 form_controller
插件的依赖:
dependencies:
flutter:
sdk: flutter
form_controller: ^0.0.1 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 创建表单控制器
form_controller
提供了一个 FormController
类,用于管理表单的状态。你可以通过继承 FormController
来创建自定义的表单控制器。
import 'package:form_controller/form_controller.dart';
class MyFormController extends FormController {
// 定义表单字段
final TextEditingController nameController = TextEditingController();
final TextEditingController emailController = TextEditingController();
[@override](/user/override)
void dispose() {
// 释放资源
nameController.dispose();
emailController.dispose();
super.dispose();
}
[@override](/user/override)
Future<void> submit() async {
// 处理表单提交逻辑
if (validate()) {
// 表单验证通过,执行提交操作
print('Name: ${nameController.text}');
print('Email: ${emailController.text}');
}
}
[@override](/user/override)
bool validate() {
// 表单验证逻辑
if (nameController.text.isEmpty) {
setError('name', 'Name is required');
return false;
}
if (emailController.text.isEmpty) {
setError('email', 'Email is required');
return false;
}
return true;
}
}
3. 在 UI 中使用表单控制器
在 Flutter 的 UI 中,你可以使用 FormController
来管理表单的状态。以下是一个简单的示例:
import 'package:flutter/material.dart';
import 'package:form_controller/form_controller.dart';
class MyForm extends StatefulWidget {
[@override](/user/override)
_MyFormState createState() => _MyFormState();
}
class _MyFormState extends State<MyForm> {
final MyFormController _formController = MyFormController();
[@override](/user/override)
void dispose() {
_formController.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Form Controller Example'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
TextField(
controller: _formController.nameController,
decoration: InputDecoration(
labelText: 'Name',
errorText: _formController.getError('name'),
),
),
SizedBox(height: 16.0),
TextField(
controller: _formController.emailController,
decoration: InputDecoration(
labelText: 'Email',
errorText: _formController.getError('email'),
),
),
SizedBox(height: 16.0),
ElevatedButton(
onPressed: () async {
await _formController.submit();
},
child: Text('Submit'),
),
],
),
),
);
}
}