一,概述

    表单时一个包含表单元素的区域。 表单元素允许用户输入内容,比如文本域,下拉列表,单选框,复选框等。常见的应用场景有:登录注册输入信息等。

表单里有两个重要的组件:

  • Form:用来做整个表单提交使用  
  • TextFormField:用来做用户输入。  

    正式向服务器提交数据前,都会对各个输入框数据进行合法性校验。但对每个TextField都分别校验很麻烦。

如果想清除一组TextfFiled的内容,一个个清除也很麻烦。所以,Flutter提供了一个Form widget,可以对输入框进行分组,然后进行一些统一的操作。

二,构造函数

  • Form:

    • 介绍:Form继承自StatefulWidget对象,它对应的状态类为FormState
    • 构造函数:
      1. const Form({
      2. Key key,
      3. @required this.child,
      4. this.autovalidate = false,
      5. this.onWillPop,
      6. this.onChanged,
      7. }) : assert(child != null),
      8. super(key: key);
    • 参数含义

      1. autovalidate:是否自动校验输入内容;当为 true 时,每一个子FormField内容发生变化时都会自动校验合法性,并直接显示错误信息。否则,需要通过调用 FormState.validate() 来手动校验.
      2. onWillPop:决定Form所在的路由是否可以直接返回(如点击返回按钮),该回调返回一个 Future 对象,如果Future的最终结果是false,则当前路由不会返回;如果为 true ,则会返回到上一个路由。此属性通常用于拦截返回按钮。
      3. onChangedForm的任意一个子FormField内容发生变化时会触发此回调。
  • FormField:
    • 介绍:Form的子孙元素必须是FormField类型,FormField是一个抽象类,定义几个属性,FormState内 部通过它们来完成操作
    • 构造函数:
      1. const FormField({
      2. Key key,
      3. @required this.builder,
      4. this.onSaved,
      5. this.validator,
      6. this.initialValue,
      7. this.autovalidate = false,
      8. this.enabled = true,
      9. }) : assert(builder != null),
      10. super(key: key);
    • 参数含义:
      1. FormFieldSetter<T> onSaved, //保存回调
      2. FormFieldValidator<T> validator, //验证回调
      3. T initialValue, //初始值
      4. bool autovalidate = false, //是否自动校验。
    • 补充:Flutter提供了一个TextFormField widget,它继承自FormField类,也是 TextField的一个包装类,所以除了FormField定义的属性之外,它还包括TextField的属性。
  • FormState:
    • 介绍:FormState为Form的State类,可以通过 Form.of() 或GlobalKey获得。可以通过它来对 Form的子孙FormField进行统一操作。
    • 构造函数:无自定义构造函数
    • 常用的三个方法:
      1. FormState.validate() :调用此方法后,会调用Form子孙FormFieldvalidate回调,如 果有一个校验失败,则返回false,所有校验失败项都会返回用户返回的错误提示。
      2. FormState.save() :调用此方法后,会调用Form子孙FormFieldsave回调,用于保存表单 内容.
      3. FormState.reset() :调用此方法后,会将子孙FormField的内容清空。

三,TextField, FormField

  • 从最基础的讲起,对于TextField就是android中的edittext,就是一个输入框( TextField class),这个输入框常用的属性如下:

    1. child: new TextField(
    2. autocorrect: false, // 是否自动校正
    3. autofocus: false, //自动获取焦点
    4. enabled: true, // 是否启用
    5. inputFormatters: [], //对输入的文字进行限制和校验
    6. keyboardType: TextInputType.text, //获取焦点时,启用的键盘类型
    7. maxLines: , // 输入框最大的显示行数
    8. maxLength: , //允许输入的字符长度/
    9. maxLengthEnforced: false, //是否允许输入的字符长度超过限定的字符长度
    10. obscureText: true, // 是否隐藏输入的内容
    11. onChanged: (newValue) {
    12. // print(newValue); // 当输入内容变更时,如何处理
    13. },
    14. onSubmitted: (value) {
    15. // print("whar"); // 当用户确定已经完成编辑时触发
    16. },
    17. style: new TextStyle(
    18. color: new Color(Colors.amberAccent.green)), // 设置字体样式
    19. textAlign: TextAlign.center, //输入的内容在水平方向如何显示
    20. decoration: new InputDecoration(
    21. labelText: "城市",
    22. icon: new Icon(Icons.location_city),
    23. border: new OutlineInputBorder(), // 边框样式
    24. helperText: 'required',
    25. hintText: '请选择你要投保的城市',
    26. prefixIcon: new Icon(Icons.android),
    27. prefixText: 'Hello'),
    28. ),
  • 输入处理

    其实对于一个输入框,我们最关心的无非就是监听输入的内容,然后输入完成后,输入框中的内容是什么,文档中写的很清楚,textfiled控件有三个回调函数

    在这里我们只需要关注onChanged和onSubmitted即可。

    1. child: new TextField(
    2. controller: _controller,
    3. decoration: new InputDecoration(labelText: 'Your Name'),
    1. onChanged: (val) {
    2.   print(val);
    3. },
    1. onSubmitted: (String v) {
    2.   print(v);
    3. },
    4. ),
  • 顾名思义:
      onChanged事件,在输入内容发生变化的时候触发,onSubmitted事件,则是在输入结束,点击完成的时候触发。 然而在TextFormField中没有这两个事件,取而代之的是validator,onSaved,onFieldSubmitted 他们都接受三个函数,并且将其值作为参数传递到函数里面validator,如果开启autovalidate: true,那么将会自动检验输入的值,如果没有则会在表单提交的时候检验 该函数只允许返回验证失败的错误信息以及验证通过时返回null。onSaved, 当调用FormState.save方法的时候调用。onFieldSubmitted, 与onSubmitted一样,则是在输入结束,点击完成的时候触发。
  • 编辑控制

      无论是在TextField还是TextFormField中,都有一个重要的属性controller,该属性可用来对输入框内容进行控制。 先创建一个控制对象:

    1. TextEditingController _controller = new TextEditingController();
    2. TextEditingController _formFieldController = new TextEditingController();

    为输入框初始化值以及注册一个监听事件:

    1. @override
    2. void initState() {
    3. // TODO: implement initState
    4. super.initState();
    5. _controller.value = new TextEditingValue(text: 'Hello');
    6. _formFieldController.addListener(() {
    7. print('listener');
    8. });
    9. }

    触发一个监听事件:

    1. void _textFieldAction() {
    2. // print(_formFieldController.selection);
    3. // print(_formFieldController.text); //获取输入内容
    4. print(_formFieldController.hasListeners); //判断是否注册监听事件
    5. _formFieldController.notifyListeners(); //触发监听事件
    6. }

四,示例代码  

  1. import 'package:flutter/material.dart';
  2.  
  3. void main() => runApp(new HomePage());
  4.  
  5. class HomePage extends StatefulWidget {
  6. @override
  7. _HomePageState createState() => new _HomePageState();
  8. }
  9.  
  10. class _HomePageState extends State<HomePage> {
  11. GlobalKey<FormState> _formKey = new GlobalKey<FormState>();
  12. String _name;
  13. String _password;
  14.  
  15. void _forSubmitted() {
  16. var _form = _formKey.currentState;
  17. if (_form.validate()) {
  18. _form.save();
  19. print(_name);
  20. print(_password);
  21. }
  22. }
  23.  
  24. @override
  25. Widget build(BuildContext context) {
  26. // TODO: implement build
  27. return new MaterialApp(
  28. title: 'Flutter data',
  29. home: new Scaffold(
  30. appBar: new AppBar(
  31. title: new Text('Flutter Form'),
  32. ),
  33. floatingActionButton: new FloatingActionButton(
  34. onPressed: _forSubmitted,
  35. child: new Text('提交'),
  36. ),
  37. body: new Container(
  38. padding: const EdgeInsets.all(16.0),
  39. child: new Form(
  40. key: _formKey,
  41. child: new Column(
  42. children: <Widget>[
  43. new TextFormField(
  44. decoration: new InputDecoration(
  45. labelText: 'Your Name',
  46. ),
  47. onSaved: (val) {
  48. _name = val;
  49. },
  50. ),
  51. new TextFormField(
  52. decoration: new InputDecoration(
  53. labelText: 'Password',
  54. ),
  55. obscureText: true,
  56. validator: (val) {
  57. return val.length < ? "密码长度错误" : null;
  58. },
  59. onSaved: (val) {
  60. _password = val;
  61. },
  62. ),
  63. ],
  64. ),
  65. ),
  66. ),
  67. ),
  68. );
  69. }
  70. }

五,官方文档
表单 Widgets

【Flutter学习】基本组件之基本表单组件的更多相关文章

  1. Flutter学习笔记(13)--表单组件

    如需转载,请注明出处:Flutter学习笔记(13)--表单组件 表单组件是个包含表单元素的区域,表单元素允许用户输入内容,比如:文本区域,下拉表单,单选框.复选框等,常见的应用场景有:登陆.注册.输 ...

  2. Vue组件之自定义表单组件

    今天又看了一遍vue的文档,记得之前学习的时候,官方文档中有提过,v-model指令是一个语法糖,做两件事,一个是给表单控件元素绑定value,第二个是当输入时更新绑定的值,不过后来在"表单 ...

  3. 「小程序JAVA实战」小程序的表单组件(25)

    转自:https://idig8.com/2018/08/18/xiaochengxujavashizhanxiaochengxudebiaodanzujian25/ 来说下 ,小程序的基础组件.源码 ...

  4. 第二百二十一节,jQuery EasyUI,Form(表单)组件

    jQuery EasyUI,Form(表单)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 Form(表单)组件的使用方法,这个组件不依赖于 ...

  5. ng2 学习笔记(二)表单及表单验证

    在上一篇文章中提到了表单,只说了表单的数据绑定,这一篇文章主要讲一下表单验证,为什么把表单单独拿出来学习,主要是因为,表单是商业应用的支柱,我们用它来执行登录.求助.下单.预订机票.安排会议,以及不计 ...

  6. 【09】react 之 表单组件

    不太清楚有多少初学React的同学和博主当时一样,在看完React的生命周期.数据流之后觉得已经上手了,甩开文档啪啪啪的开始敲了起来.结果...居然被一个input标签给教做人了. 故事是这样的:首先 ...

  7. 从后端到前端之Vue(六)表单组件

    表单组件 做项目的时候会遇到一个比较头疼的问题,一个大表单里面有好多控件,一个一个做设置太麻烦,更头疼的是,需求还总在变化,一会多选.一会单选.一会下拉的,变来变去的烦死宝宝了. 那么怎么解决这个问题 ...

  8. 微信小程序-表单组件

    button 按钮 注:button-hover 默认为{background-color: rgba(0, 0, 0, 0.1); opacity: 0.7;} 示例代码: /** wxss **/ ...

  9. Django学习笔记(五)—— 表单

    疯狂的暑假学习之  Django学习笔记(五)-- 表单 參考:<The Django Book> 第7章 1. HttpRequest对象的信息 request.path         ...

随机推荐

  1. redis-持久化、主从复制、集群

    持久化 RDB.AOF(redis.conf) 主从复制 redis.conf 集群 redis-trib.rb.ruby相见如下链接http://www.cnblogs.com/wuxl360/p/ ...

  2. vue基础六

    列表渲染 1.v-for 我们用 v-for 指令根据一组数组的选项列表进行渲染. v-for 指令需要以 item in items 形式的特殊语法(也可以用of代替in), items是源数据数组 ...

  3. 【Flutter学习】页面跳转之SliverAppBar,CustomScrollView,NestedScrollView的使用

    一,flutter SliverAppbar 控件介绍 SliverAppBar “应用栏” 相当于升级版的 appbar 于 AppBar 位置的固定的应用最上面的; 而 SliverAppBar ...

  4. layui-treeTable v2.0添加搜索功能

    layui-treeTable 添加搜索功能 在树形表格头部加一个input框: <div class="layui-inline"> <input class= ...

  5. ZROI week2

    \[ZROI week2\] 除草机 首先考虑最少的拐点肯定是那种螺旋形状的,然后手玩几个数据发现和列数(行数)有关,且每增加1就是上一个状态加2,直接\(O(1)\)公式即可 吐槽:为啥\(n,m\ ...

  6. 分布式系统理论基础4:Paxos

    本文转自:https://www.cnblogs.com/bangerlee/p/5655754.html 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到 ...

  7. Backdoor CTF 2013 :电子取证250

    0x00题目 h4x0r厌烦了你对他的城堡的所有攻击,所以他决定报复攻击你,他给你发来一封带有图片的邮件作为警告,希望你能找出他的警告消息:-) 消息的MD5值就是flag. 图片如下: 0x01解题 ...

  8. ffmpeg -视频旋转和高清转码示例

    手头有一个竖屏拍摄的视频(真诚建议不要这么做..),导入到电脑上以后势必要把它旋转90°,可是没想到就这样简单的一个功能,尝试了N个非编软件(openshot, pitivi,还有坑爹的lives)后 ...

  9. Eclipes更改字体颜色

    有图有真像 更改字体大小

  10. linux replace \r\n to \n

    cat test.log | tr -d '\r' | hexdump -C | tail