Flutter体验 Day 10-表单组件

表单组件

使用表单处理使用者输入是常见的应用的基础功能,使用这些表单组件可以应用在注册、登入、电商…需要使用者输入资料的情境,因此我们今天就来练习这些常在表单上会出现的widget吧。

常用表单组件

  • TextField
  • TextFormField
  • Switch
  • Radio
  • CheckBox
  • DropdownButton

TextField

TextField 可输入文字功能的组件。

在大部份的表单类的组件,会使用onChanged属性监控输入的资料是否发生变动,且使用StatefulWidgetState记录异动的资料,其中我们也可以使用TextEditingController设定controller属性,使用控制器处理资料,例如重置按钮的功能。

    var textField = Container(
      margin: EdgeInsets.all(20.0),
      child: TextField(
        controller: searchController,
        decoration: InputDecoration(
          hintText: 'Search',
        ),
        onChanged: (String text) {
          setState(() {
            value = "Search: $text";
          });
        },
      ),
    );

TextField

TextFormField

TextFormFieldTextField也类似,不过它额外提供了validator属性,配合 Form widget 的使用,可以在表单送出时用来验证输入的资料格式是否正确。

    var nameTextFiled = Container(
      margin: EdgeInsets.all(20.0),
      child: TextFormField(
        autofocus: true,
        controller: nameController,
        decoration: InputDecoration(
          border: OutlineInputBorder(),
          labelText: 'Full Name',
        ),
        onChanged: (String text) {
          setState(() {
            value = "Full name: $text";
          });
        },
        validator: (String? value) {
          if (value == null || value.isEmpty) {
            return '姓名不得为空';
          }
          return null;
        },
      ),
    );

textformfield

若是需要有保密性的输入资料,也可以将obscureText属性设定为true

    var passwordTextFormField = Container(
      margin: EdgeInsets.all(20),
      child: TextFormField(
        obscureText: true,
        decoration: const InputDecoration(
          labelText: 'Password',
        ),
        onChanged: (String text) {
          setState(() {
            value = "Password: $text";
          });
        },
        validator: (String? value) {
          RegExp mobile =
              new RegExp(r"(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,12}$");

          if (value == null || value.isEmpty) {
            return '密码格式不符合为空';
          }

          if (!mobile.hasMatch(value)) {
            return "密码格式不符合";
          }

          return null;
        },
      ),
    );

obsecure

Switch

Switch组件提供一个控制两种状态的切换按钮。

    var theSwitch = Switch(
      value: isSwitched,
      onChanged: (value) {
        setState(() {
          isSwitched = value;
        });
      },
      activeTrackColor: Colors.yellow,
      activeColor: Colors.orangeAccent,
    );

form_switch

CheckBox

CheckBox组件可以用来在表单的"多"个提交项目中进行选取。

    var theCheckBox = Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Checkbox(
          value: optionsA,
          activeColor: Colors.red, //选中时的颜色
          onChanged: (value) {
            setState(() {
              optionsA = value!;
            });
          },
        ),
        Text("A"),
        Checkbox(
          value: optionsB,
          activeColor: Colors.red, //选中时的颜色
          onChanged: (value) {
            setState(() {
              optionsB = value!;
            });
          },
        ),
        Text("B"),
      ],
    );

form_checkbox

Radio

Radio可以用来在表单的"单"个提交项目中进行选取

    var theRadio = Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Radio<String>(
          value: "1",
          groupValue: radioValue,
          onChanged: (value) {
            setState(() {
              radioValue = value;
            });
          },
        ),
        Text("选项一"),
        Radio<String>(
          value: "2",
          groupValue: radioValue,
          onChanged: (value) {
            setState(() {
              radioValue = value;
            });
          },
        ),
        Text("选项二"),
      ],
    );

form_radio

DropdownButton

DropdownButton 提供下拉式选择的列表功能,需要在items属性提供对应用 DropdownMenuItem

    var theDropdownButton = DropdownButton(
      value: dropdownValue,
      icon: Icon(Icons.keyboard_arrow_down),
      onChanged: (String? value) {
        print(value);
        setState(() {
          dropdownValue = value!;
        });
      },
      items: items.map((String item) {
        return DropdownMenuItem(
          value: item,
          child: Text(item),
        );
      }).toList(),
    );

form_dropdown

小结

练习成果

今天学习了在表单功能上常见的组件,以及如何透过 State 记录使用者输入的资料,我们在後面章节会在介绍到 Http 的操作方式。


<<:  [Java Day07] 2.2. 初始化区块

>>:  Day 3 - 系统面临哪些威胁?

Day 12:为 Hexo 装设 Google Analytics,追踪你的部落格流量(使用 Next 布景主题)

如果你曾经使用过一些 BSP 服务,基本上本身都会内建流量或人数统计的功能,帮助我们查看部落格近期人...

Swift 新手-App Launch Screen 设计&程序码互动

设计 Launch Screen 会需要用到两个档案,分别是: Main.storyboard(用途...

用 Line LIFF APP 实现信箱验证绑定功能(1) - 取得 user email

先前提过,手动发身份认证码给使用者,再让使用手动输入验证码的流程太不友善,今天就开始着手优化这个步骤...

Day 26 - State Monad I

还记得先前提到 Math.random 并非是纯函式吗,因为每次给定相同的输入都会是不同的输出回传回...

WordPress 点击图片放大效果-Easy FancyBox 外挂教学

当我们在部落格上写文章贴图片的时候,有些图片本身解析度就比较大,例如一张 4000 x 3000 大...