一,概述

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

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

  • 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);
    • 参数含义

      autovalidate:是否自动校验输入内容;当为 true 时,每一个子FormField内容发生变化时都会自动校验合法性,并直接显示错误信息。否则,需要通过调用 FormState.validate() 来手动校验.
      onWillPop:决定Form所在的路由是否可以直接返回(如点击返回按钮),该回调返回一个 Future 对象,如果Future的最终结果是false,则当前路由不会返回;如果为 true ,则会返回到上一个路由。此属性通常用于拦截返回按钮。
      onChanged:Form的任意一个子FormField内容发生变化时会触发此回调。
  • 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);
    • 参数含义:
      FormFieldSetter<T> onSaved, //保存回调
      FormFieldValidator<T> validator, //验证回调
      T initialValue, //初始值
      bool autovalidate = false, //是否自动校验。
    • 补充: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的内容清空。

三,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'),
    ),
  • 输入处理

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

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

    child: new TextField(
    controller: _controller,
    decoration: new InputDecoration(labelText: 'Your Name'),
     onChanged: (val) {
      print(val);
    },
     onSubmitted: (String v) {
      print(v);
    },
    ),
  • 顾名思义:
      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(); //触发监听事件
    }

四,示例代码  

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学习】基本组件之基本表单组件的更多相关文章

  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. 【和孩子一起学编程】 python笔记--第四天

    第十一章: 可变循环 newStars = int(input("how many stars do you want?")) for i in range(newStars): ...

  2. sql server教程

    简单认识 SQL Server sql server教程 SQL Server 是 Microsoft 开发的一个关系数据库管理系统(RDBMS),现在是世界上最为常用的数据库: SQL Server ...

  3. 百度链接提交主动推送 c#实现

    说明:此方法适合百度站长,利用此方法可以第一时间将你的原创文章上传到百度,保护你的著作权,也可以帮你的网站进行引流 以下是代码实现: /// <summary>         /// 提 ...

  4. POJ 3159 Candies(spfa、差分约束)

    Description During the kindergarten days, flymouse was the monitor of his class. Occasionally the he ...

  5. LUOGU P2617 Dynamic Rankings(树状数组套主席树)

    传送门 解题思路 动态区间第\(k\)大,树状数组套主席树模板.树状数组的每个位置的意思的是每棵主席树的根,维护的是一个前缀和.然后询问的时候\(log\)个点一起做前缀和,一起移动.时空复杂度\(O ...

  6. cookie的使用说明

    cookie的英文意思是饼干的意思,实质上是键值对组成的字典.就是说你访问某一个网址,服务器给你一个东西,你收到东西,并且贴上了一个标签.下次你访问服务器的时候,请求带有标签.这样服务器给你之后,就会 ...

  7. (转)Android Studio启动AVD遇到的问题 ( HAXM安装失败)

    转:https://zhidao.baidu.com/question/561420516357269084.html?qq-pf-to=pcqq.c2c Android Studio启动虚拟机的时候 ...

  8. java并发编程笔记(四)——安全发布对象

    java并发编程笔记(四)--安全发布对象 发布对象 使一个对象能够被当前范围之外的代码所使用 对象逸出 一种错误的发布.当一个对象还没构造完成时,就使它被其他线程所见 不安全的发布对象 某一个类的构 ...

  9. 67、saleforce的object的describe方法使用

    使用Schema类的describesSObjects方法获取描述sObject结果.使用此方法可以通过sObject类型名称描述一个或者多个sObject描述信息. //sObject types ...

  10. 基于turtle库的七段数码管绘制

    ·文章结构 >样例及概览 >函数框架分析 >功能发展·样例及概览 七段数码管,是信号灯.电子表等很多设备的显示形式.而利用python的turtle库,我们也可以模拟着写出一个动态生 ...