Flutter表单管理插件reactive_forms_lbc的使用
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
更多关于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),
),
);
}
},
),
],
),
);
},
),
);
}
}
在这个示例中,我们做了以下几件事:
-
创建表单组:使用
fb.group
创建了一个包含两个字段(name
和email
)的表单组,并为每个字段添加了相应的验证器。 -
构建表单:使用
ReactiveFormBuilder
包装表单,它接受一个formGroup
和一个构建函数。在构建函数中,我们使用ReactiveTextField
来创建表单字段。 -
处理表单提交:使用
ReactiveFormConsumer
来根据表单的有效性动态显示或禁用提交按钮。当表单有效时,点击按钮会打印出表单数据;当表单无效时,按钮被禁用。
这个示例展示了如何使用 reactive_forms_lbc
来管理表单状态,包括字段验证和表单提交处理。你可以根据需要扩展这个示例,添加更多的字段和复杂的验证逻辑。