使用表单处理使用者输入是常见的应用的基础功能,使用这些表单组件可以应用在注册、登入、电商…需要使用者输入资料的情境,因此我们今天就来练习这些常在表单上会出现的widget吧。
TextField
可输入文字功能的组件。
在大部份的表单类的组件,会使用onChanged
属性监控输入的资料是否发生变动,且使用StatefulWidget
的State
记录异动的资料,其中我们也可以使用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";
});
},
),
);
TextFormField
与TextField
也类似,不过它额外提供了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;
},
),
);
若是需要有保密性的输入资料,也可以将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;
},
),
);
Switch
组件提供一个控制两种状态的切换按钮。
var theSwitch = Switch(
value: isSwitched,
onChanged: (value) {
setState(() {
isSwitched = value;
});
},
activeTrackColor: Colors.yellow,
activeColor: Colors.orangeAccent,
);
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"),
],
);
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("选项二"),
],
);
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(),
);
今天学习了在表单功能上常见的组件,以及如何透过 State 记录使用者输入的资料,我们在後面章节会在介绍到 Http 的操作方式。
如果你曾经使用过一些 BSP 服务,基本上本身都会内建流量或人数统计的功能,帮助我们查看部落格近期人...
设计 Launch Screen 会需要用到两个档案,分别是: Main.storyboard(用途...
先前提过,手动发身份认证码给使用者,再让使用手动输入验证码的流程太不友善,今天就开始着手优化这个步骤...
还记得先前提到 Math.random 并非是纯函式吗,因为每次给定相同的输入都会是不同的输出回传回...
当我们在部落格上写文章贴图片的时候,有些图片本身解析度就比较大,例如一张 4000 x 3000 大...