flutter|flutter 表单Form使用示例
介绍
flutter提供一套表单校验框架Form,可以通过Form框架一步校验所有表单,非常方便,比较常用的用法是Form+TextFormField。
Form
class Form extends StatefulWidget {
final Widget child;
...
const Form({
Key key,
@required this.child,
this.autovalidate = false,
this.onWillPop,
this.onChanged,
})
...
Form继承StatefulWidget,有一个widget 类型的child参数,证明Form是一个容器。
Form里还有一个validate方法,如下
bool validate() {
...
}
一般通过GlobalKey来访问Form中validate方法,Form的validate方法用来校验所有Form里的FormField表单,validate方法返回值是bool类型,返回true表示所有表单校验成功;返回false表示有校验失败的表单;
TextFormField
class TextFormField extends FormField {
...
TextFormField({
...
FormFieldValidator validator,
...
})
TextFormField继承FormField,FormField后面源码分析会讲,所有Form可统一校验的表单都必须继承FormField,可以通过FormField自定义各种各样可校验表单,TextFormField只是FormField自定义表单中的一种。
表单校验必须实现的方法为validator,定义如下:
typedef FormFieldValidator = String Function(T value);
每个表单的校验规则都在validator里实现,通过返回值来判断是否校验成功。
- 返回null,表示表单校验成功
- 返回非null,表示表单校验失败,其实返回的非null还可以用来表示校验失败的错误提示信息,TextFormField内部实现就将返回的非null当成错误信息提示出来。
Form(
key:xxx,
child:xxx
2、将GlobalKey传给Form,用于调用Form里方法,如下:
final GlobalKey _formKey = GlobalKey();
Form(
key:_formKey,
child:xxx
3、将TextFormField传给Form容器,如下:
final GlobalKey _formKey = GlobalKey();
Form(
key:_formKey,
child:
...
TextFormField
...
【flutter|flutter 表单Form使用示例】4、实现对应TextFormField的校验规则 ,如下:
final GlobalKey _formKey = GlobalKey();
Form(
key:_formKey,
child:
...
TextFormField(
validator: (value) {
...
return xxx;
},
)
...
5、最后调用Form校验所有表单方法validate,如下:
_formKey.currentState.validate()
使用示例
void main() {
runApp(MyApp());
}class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('系统表单'),
backgroundColor: Colors.blue,
),
body: HomeContent(),
),
);
}
}class HomeContent extends StatefulWidget {
HomeContent({Key key}) : super(key: key);
_HomeContentState createState() => _HomeContentState();
}class _HomeContentState extends State {
final GlobalKey _formKey = GlobalKey();
String phoneNum;
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.all(10),
child: Column(
children: [
Form(
key: _formKey,
child: Column(
children: [
TextFormField(
decoration: InputDecoration(
hintText: '手机号码',
),
validator: (value) {
RegExp reg = new RegExp(r'^\d{11}$');
if (!reg.hasMatch(value)) {
return '请输入11位手机号码';
}
return null;
},
),
TextFormField(
decoration: InputDecoration(
hintText: '用户名',
),
validator: (value) {
if (value.isEmpty) {
return '请输入用户名';
}
return null;
},
),
],
),
),
SizedBox(height: 10),
Row(
children: [
Expanded(
child: RaisedButton(
child: Text('校验'),
onPressed: () {
//一步校验全部表单
if (_formKey.currentState.validate()) {
Scaffold.of(context).showSnackBar(SnackBar(
content: Text('校验成功...'),
));
}
},
),
)
],
),
],
),
);
}
}
使用效果
文章图片
效果.gif
推荐阅读
- 使用SAP|使用SAP WebIDE进行SAP Cloud Platform Business Application开发
- flutter|flutter 国内镜像 解决无法安装或安装慢问题
- Flutter路由官方文档学习笔记
- 如何提高你Flutter|如何提高你Flutter app的性能
- ffmpeg源码分析01(结构体)
- Flutter的ListView
- 7、前端--jQuery简介、基本选择器、基本筛选器、属性选择器、表单选择器、筛选器方法、节点操作、绑定事件
- performSelectorOnMainThread:withObject:waitUntilDone:参数设置为NO或YES的区别
- 运用flutter|运用flutter 构建一个发布版(release)APK
- React.js的表单(六)