【Flutter学习】基本组件之基本表单组件
一,概述
表单时一个包含表单元素的区域。 表单元素允许用户输入内容,比如文本域,下拉列表,单选框,复选框等。常见的应用场景有:登录,注册,输入信息等。
表单里有两个重要的组件:
- Form:用来做整个表单提交使用
- TextFormField:用来做用户输入。
正式向服务器提交数据前,都会对各个输入框数据进行合法性校验。但对每个TextField都分别校验很麻烦。
如果想清除一组TextfFiled的内容,一个个清除也很麻烦。所以,Flutter提供了一个Form widget,可以对输入框进行分组,然后进行一些统一的操作。
二,构造函数
- Form:
- 介绍:Form继承自StatefulWidget对象,它对应的状态类为FormState
- 构造函数:
- const Form({
- Key key,
- @required this.child,
- this.autovalidate = false,
- this.onWillPop,
- this.onChanged,
- }) : assert(child != null),
- super(key: key);
- const Form({
参数含义
- autovalidate:是否自动校验输入内容;当为 true 时,每一个子FormField内容发生变化时都会自动校验合法性,并直接显示错误信息。否则,需要通过调用 FormState.validate() 来手动校验.
- onWillPop:决定Form所在的路由是否可以直接返回(如点击返回按钮),该回调返回一个 Future 对象,如果Future的最终结果是false,则当前路由不会返回;如果为 true ,则会返回到上一个路由。此属性通常用于拦截返回按钮。
- onChanged:Form的任意一个子FormField内容发生变化时会触发此回调。
- autovalidate:是否自动校验输入内容;当为 true 时,每一个子FormField内容发生变化时都会自动校验合法性,并直接显示错误信息。否则,需要通过调用 FormState.validate() 来手动校验.
- FormField:
- 介绍:Form的子孙元素必须是FormField类型,FormField是一个抽象类,定义几个属性,FormState内 部通过它们来完成操作
- 构造函数:
- const FormField({
- Key key,
- @required this.builder,
- this.onSaved,
- this.validator,
- this.initialValue,
- this.autovalidate = false,
- this.enabled = true,
- }) : assert(builder != null),
- super(key: key);
- const FormField({
- 参数含义:
- FormFieldSetter<T> onSaved, //保存回调
- FormFieldValidator<T> validator, //验证回调
- T initialValue, //初始值
- bool autovalidate = false, //是否自动校验。
- FormFieldSetter<T> onSaved, //保存回调
- 补充:Flutter提供了一个TextFormField widget,它继承自FormField类,也是 TextField的一个包装类,所以除了FormField定义的属性之外,它还包括TextField的属性。
- FormState:
- 介绍:FormState为Form的State类,可以通过 Form.of() 或GlobalKey获得。可以通过它来对 Form的子孙FormField进行统一操作。
- 构造函数:无自定义构造函数
- 常用的三个方法:
- FormState.validate() :调用此方法后,会调用Form子孙FormField的validate回调,如 果有一个校验失败,则返回false,所有校验失败项都会返回用户返回的错误提示。
- FormState.save() :调用此方法后,会调用Form子孙FormField的save回调,用于保存表单 内容.
- FormState.reset() :调用此方法后,会将子孙FormField的内容清空。
- FormState.validate() :调用此方法后,会调用Form子孙FormField的validate回调,如 果有一个校验失败,则返回false,所有校验失败项都会返回用户返回的错误提示。
三,TextField, FormField
- 从最基础的讲起,对于TextField就是android中的edittext,就是一个输入框( TextField class),这个输入框常用的属性如下:
- child: new TextField(
- autocorrect: false, // 是否自动校正
- autofocus: false, //自动获取焦点
- enabled: true, // 是否启用
- inputFormatters: [], //对输入的文字进行限制和校验
- keyboardType: TextInputType.text, //获取焦点时,启用的键盘类型
- maxLines: , // 输入框最大的显示行数
- maxLength: , //允许输入的字符长度/
- maxLengthEnforced: false, //是否允许输入的字符长度超过限定的字符长度
- obscureText: true, // 是否隐藏输入的内容
- onChanged: (newValue) {
- // print(newValue); // 当输入内容变更时,如何处理
- },
- onSubmitted: (value) {
- // print("whar"); // 当用户确定已经完成编辑时触发
- },
- style: new TextStyle(
- color: new Color(Colors.amberAccent.green)), // 设置字体样式
- textAlign: TextAlign.center, //输入的内容在水平方向如何显示
- decoration: new InputDecoration(
- labelText: "城市",
- icon: new Icon(Icons.location_city),
- border: new OutlineInputBorder(), // 边框样式
- helperText: 'required',
- hintText: '请选择你要投保的城市',
- prefixIcon: new Icon(Icons.android),
- prefixText: 'Hello'),
- ),
- child: new TextField(
- 输入处理
其实对于一个输入框,我们最关心的无非就是监听输入的内容,然后输入完成后,输入框中的内容是什么,文档中写的很清楚,textfiled控件有三个回调函数
在这里我们只需要关注onChanged和onSubmitted即可。
- child: new TextField(
- controller: _controller,
- decoration: new InputDecoration(labelText: 'Your Name'),
- onChanged: (val) {
- print(val);
- },
- onSubmitted: (String v) {
- print(v);
- },
- ),
- child: new TextField(
- 顾名思义:
onChanged事件,在输入内容发生变化的时候触发,onSubmitted事件,则是在输入结束,点击完成的时候触发。 然而在TextFormField中没有这两个事件,取而代之的是validator,onSaved,onFieldSubmitted 他们都接受三个函数,并且将其值作为参数传递到函数里面validator,如果开启autovalidate: true,那么将会自动检验输入的值,如果没有则会在表单提交的时候检验 该函数只允许返回验证失败的错误信息以及验证通过时返回null。onSaved, 当调用FormState.save方法的时候调用。onFieldSubmitted, 与onSubmitted一样,则是在输入结束,点击完成的时候触发。
- 编辑控制
无论是在TextField还是TextFormField中,都有一个重要的属性controller,该属性可用来对输入框内容进行控制。 先创建一个控制对象:
- TextEditingController _controller = new TextEditingController();
- TextEditingController _formFieldController = new TextEditingController();
为输入框初始化值以及注册一个监听事件:
- @override
- void initState() {
- // TODO: implement initState
- super.initState();
- _controller.value = new TextEditingValue(text: 'Hello');
- _formFieldController.addListener(() {
- print('listener');
- });
- }
触发一个监听事件:
- void _textFieldAction() {
- // print(_formFieldController.selection);
- // print(_formFieldController.text); //获取输入内容
- print(_formFieldController.hasListeners); //判断是否注册监听事件
- _formFieldController.notifyListeners(); //触发监听事件
- }
- TextEditingController _controller = new TextEditingController();
四,示例代码
- import 'package:flutter/material.dart';
- void main() => runApp(new HomePage());
- class HomePage extends StatefulWidget {
- @override
- _HomePageState createState() => new _HomePageState();
- }
- class _HomePageState extends State<HomePage> {
- GlobalKey<FormState> _formKey = new GlobalKey<FormState>();
- String _name;
- String _password;
- void _forSubmitted() {
- var _form = _formKey.currentState;
- if (_form.validate()) {
- _form.save();
- print(_name);
- print(_password);
- }
- }
- @override
- Widget build(BuildContext context) {
- // TODO: implement build
- return new MaterialApp(
- title: 'Flutter data',
- home: new Scaffold(
- appBar: new AppBar(
- title: new Text('Flutter Form'),
- ),
- floatingActionButton: new FloatingActionButton(
- onPressed: _forSubmitted,
- child: new Text('提交'),
- ),
- body: new Container(
- padding: const EdgeInsets.all(16.0),
- child: new Form(
- key: _formKey,
- child: new Column(
- children: <Widget>[
- new TextFormField(
- decoration: new InputDecoration(
- labelText: 'Your Name',
- ),
- onSaved: (val) {
- _name = val;
- },
- ),
- new TextFormField(
- decoration: new InputDecoration(
- labelText: 'Password',
- ),
- obscureText: true,
- validator: (val) {
- return val.length < ? "密码长度错误" : null;
- },
- onSaved: (val) {
- _password = val;
- },
- ),
- ],
- ),
- ),
- ),
- ),
- );
- }
- }
五,官方文档
表单 Widgets
【Flutter学习】基本组件之基本表单组件的更多相关文章
- Flutter学习笔记(13)--表单组件
如需转载,请注明出处:Flutter学习笔记(13)--表单组件 表单组件是个包含表单元素的区域,表单元素允许用户输入内容,比如:文本区域,下拉表单,单选框.复选框等,常见的应用场景有:登陆.注册.输 ...
- Vue组件之自定义表单组件
今天又看了一遍vue的文档,记得之前学习的时候,官方文档中有提过,v-model指令是一个语法糖,做两件事,一个是给表单控件元素绑定value,第二个是当输入时更新绑定的值,不过后来在"表单 ...
- 「小程序JAVA实战」小程序的表单组件(25)
转自:https://idig8.com/2018/08/18/xiaochengxujavashizhanxiaochengxudebiaodanzujian25/ 来说下 ,小程序的基础组件.源码 ...
- 第二百二十一节,jQuery EasyUI,Form(表单)组件
jQuery EasyUI,Form(表单)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 Form(表单)组件的使用方法,这个组件不依赖于 ...
- ng2 学习笔记(二)表单及表单验证
在上一篇文章中提到了表单,只说了表单的数据绑定,这一篇文章主要讲一下表单验证,为什么把表单单独拿出来学习,主要是因为,表单是商业应用的支柱,我们用它来执行登录.求助.下单.预订机票.安排会议,以及不计 ...
- 【09】react 之 表单组件
不太清楚有多少初学React的同学和博主当时一样,在看完React的生命周期.数据流之后觉得已经上手了,甩开文档啪啪啪的开始敲了起来.结果...居然被一个input标签给教做人了. 故事是这样的:首先 ...
- 从后端到前端之Vue(六)表单组件
表单组件 做项目的时候会遇到一个比较头疼的问题,一个大表单里面有好多控件,一个一个做设置太麻烦,更头疼的是,需求还总在变化,一会多选.一会单选.一会下拉的,变来变去的烦死宝宝了. 那么怎么解决这个问题 ...
- 微信小程序-表单组件
button 按钮 注:button-hover 默认为{background-color: rgba(0, 0, 0, 0.1); opacity: 0.7;} 示例代码: /** wxss **/ ...
- Django学习笔记(五)—— 表单
疯狂的暑假学习之 Django学习笔记(五)-- 表单 參考:<The Django Book> 第7章 1. HttpRequest对象的信息 request.path ...
随机推荐
- redis-持久化、主从复制、集群
持久化 RDB.AOF(redis.conf) 主从复制 redis.conf 集群 redis-trib.rb.ruby相见如下链接http://www.cnblogs.com/wuxl360/p/ ...
- vue基础六
列表渲染 1.v-for 我们用 v-for 指令根据一组数组的选项列表进行渲染. v-for 指令需要以 item in items 形式的特殊语法(也可以用of代替in), items是源数据数组 ...
- 【Flutter学习】页面跳转之SliverAppBar,CustomScrollView,NestedScrollView的使用
一,flutter SliverAppbar 控件介绍 SliverAppBar “应用栏” 相当于升级版的 appbar 于 AppBar 位置的固定的应用最上面的; 而 SliverAppBar ...
- layui-treeTable v2.0添加搜索功能
layui-treeTable 添加搜索功能 在树形表格头部加一个input框: <div class="layui-inline"> <input class= ...
- ZROI week2
\[ZROI week2\] 除草机 首先考虑最少的拐点肯定是那种螺旋形状的,然后手玩几个数据发现和列数(行数)有关,且每增加1就是上一个状态加2,直接\(O(1)\)公式即可 吐槽:为啥\(n,m\ ...
- 分布式系统理论基础4:Paxos
本文转自:https://www.cnblogs.com/bangerlee/p/5655754.html 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到 ...
- Backdoor CTF 2013 :电子取证250
0x00题目 h4x0r厌烦了你对他的城堡的所有攻击,所以他决定报复攻击你,他给你发来一封带有图片的邮件作为警告,希望你能找出他的警告消息:-) 消息的MD5值就是flag. 图片如下: 0x01解题 ...
- ffmpeg -视频旋转和高清转码示例
手头有一个竖屏拍摄的视频(真诚建议不要这么做..),导入到电脑上以后势必要把它旋转90°,可是没想到就这样简单的一个功能,尝试了N个非编软件(openshot, pitivi,还有坑爹的lives)后 ...
- Eclipes更改字体颜色
有图有真像 更改字体大小
- linux replace \r\n to \n
cat test.log | tr -d '\r' | hexdump -C | tail