上一节介绍了文本部件,用于显示文本。但是在我们进行日常软件开发过程中,经常是需要获取用户键入的内容,比如用户名、密码、性别、喜好等等。
Flutter 提供了丰富的部件来处理用户输入,本节将主要介绍以下几个常用部件TextField、Form、CheckBox、Radio、Switch、Slider。
TextField 不仅允许用户输入文本,而且提供了多种配置选项,使得开发者能够轻松适应各种输入场景。
1.1 构造方法
TextField( controller: _textController, decoration: InputDecoration( labelText: 'Enter your text', hintText: 'Type something...', prefixIcon: Icon(Icons.text_fields), suffixIcon: Icon(Icons.clear), border: OutlineInputBorder(), ), keyboardType: TextInputType.text, textInputAction: TextInputAction.done, onChanged: (text) { // Handle text changes }, onSubmitted: (text) { // Handle text submission }, maxLength: 50, maxLines: 1, obscureText: false, autocorrect: true, enableSuggestions: true, autofocus: false, readOnly: false, style: TextStyle(fontSize: 16.0, color: Colors.black),)
关键属性和参数:
1.2 基本使用
首先,让我们看一下 TextField 的最基本用法。以下是一个简单的 TextField 示例:
TextField( decoration: InputDecoration( labelText: 'Enter your text', ),)
在这个例子中,我们创建了一个基本的文本输入框,用于用户输入文本。decoration 属性允许我们定义输入框的外观,包括标签(labelText)等。
1.3 控制输入内容
使用 TextField 时,通常我们需要读取或修改输入框中的文本。为了实现这一点,我们可以使用 TextEditingController。
TextEditingController _textController = TextEditingController();TextField( controller: _textController, decoration: InputDecoration( labelText: 'Enter your text', ),)
通过将 _textController 传递给 controller 属性,我们现在能够在需要时读取或修改文本。
1.4 样式
TextField 提供了丰富的外观定制选项。通过 InputDecoration 属性,我们可以设置标签、提示文本、边框等。
TextField( decoration: InputDecoration( labelText: 'Username', hintText: 'Enter your username', prefixIcon: Icon(Icons.person), suffixIcon: Icon(Icons.clear), border: OutlineInputBorder(), ),)
在这个例子中,我们添加了前缀图标(prefixIcon)和后缀图标(suffixIcon),同时使用 OutlineInputBorder 设置了输入框的边框。
1.5 输入类型
TextField 通过keyboardType属性来指定所使用的键盘类型,根据输入的内容类型选择合适的键盘。以下是一些 keyboardType 的示例代码:
//文本类型TextField( keyboardType: TextInputType.text, decoration: InputDecoration( labelText: 'Enter your text', ),)//数字类型//显示一个数字键盘,只允许输入数字TextField( keyboardType: TextInputType.number, decoration: InputDecoration( labelText: 'Enter a number', ),)//可见密码//用于输入密码时可以看到实际的字符TextField( keyboardType: TextInputType.visiblePassword, decoration: InputDecoration( labelText: 'Enter your password', ),)
1.6 键盘操作按钮
TextField通过textInputAction 属性用于设置在键盘上显示的操作按钮。它可以用来指示用户完成当前输入框后的操作。以下是一些使用 textInputAction 的示例代码:
//下一步//当用户点击键盘上的“下一步”按钮时,会触发 onSubmitted 回调,并将焦点移动到下一个输入框TextField( textInputAction: TextInputAction.next, decoration: InputDecoration( labelText: 'Username', ), onSubmitted: (text) { // Handle username submission // Move focus to the next input field FocusScope.of(context).nextFocus(); },)// 完成//当用户点击键盘上的“完成”按钮时,会触发 onSubmitted 回调,执行密码的提交操作TextField( textInputAction: TextInputAction.done, decoration: InputDecoration( labelText: 'Password', ), obscureText: true, onSubmitted: (text) { // Handle password submission // Perform any final actions },)//搜索TextField( textInputAction: TextInputAction.search, decoration: InputDecoration( labelText: 'Search', ), onSubmitted: (text) { // Handle search submission // Perform search operation },)//发送TextField( textInputAction: TextInputAction.send, decoration: InputDecoration( labelText: 'Message', ), onSubmitted: (text) { // Handle message submission // Send the message },)
用于组织和验证表单字段的重要小部件。它提供了一种结构化的方式来处理用户输入,并允许轻松执行表单验证。
下面的代码将创建一个简单的表单,其中包含一个文本输入框和一个提交按钮。在这个例子中,我们使用 TextFormField 来接收用户的文本输入。
class MyForm extends StatefulWidget { @override _MyFormState createState() => _MyFormState();}class _MyFormState extends State<MyForm> { final _formKey = GlobalKey<FormState>(); final _textController = TextEditingController(); @override Widget build(BuildContext context) { return Form( key: _formKey, child: Padding( padding: const EdgeInsets.all(16.0), child: Column( children: [ TextFormField( controller: _textController, decoration: InputDecoration( labelText: 'Enter your text', ), validator: (value) { if (value == null || value.isEmpty) { return 'Please enter some text'; } return null; }, ), SizedBox(height: 16.0), ElevatedButton( onPressed: () { if (_formKey.currentState!.validate()) { // Form is valid, perform action String enteredText = _textController.text; print('Entered text: $enteredText'); } }, child: Text('Submit'), ), ], ), ), ); }}
关键代码解析:
在 Flutter 中,Checkbox 是用于创建复选框(Checkbox)的部件,用户可以通过点击复选框来选择或取消选择。
3.1 构造函数
Checkbox({ Key? key, bool value = false, required ValueChanged<bool?>? onChanged, Color? activeColor, Color? checkColor, MaterialTapTargetSize? materialTapTargetSize, VisualDensity? visualDensity, bool autofocus = false,})
主要的参数说明:
3.2 基本使用
Checkbox( value: true, onChanged: (value) { // Handle checkbox state change }, activeColor: Colors.blue, checkColor: Colors.white,)
在这个示例中,Checkbox 被创建为已选中状态,当用户点击时,onChanged 回调函数将被调用,并传递新的状态。选中状态下,复选框的颜色为蓝色,勾选的颜色为白色。
在 Flutter 中,Radio 是用于创建单选框的小部件,用户可以从一组选项中选择一个。
4.1 构造函数
Radio<T>({ Key? key, required T value, required T groupValue, required ValueChanged<T?> onChanged, Color? activeColor, FocusNode? focusNode, MaterialTapTargetSize? materialTapTargetSize, Color? fillColor, bool toggleable = false, bool autofocus = false,})
主要参数说明:
4.2 基本使用
Radio<String>( value: 'Option 1', groupValue: selectedValue, onChanged: (value) { setState(() { selectedValue = value!; }); }, activeColor: Colors.blue,)
在这个示例中,Radio 被创建为表示字符串类型的单选框,通过 value 和 groupValue 来控制选中状态,通过 onChanged 来处理状态的变化。选中状态下,单选框的颜色为蓝色。
Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Radio( value: 'Option 1', groupValue: selectedValue, onChanged: (value) { setState(() { selectedValue = value.toString(); }); }, ), Radio( value: 'Option 2', groupValue: selectedValue, onChanged: (value) { setState(() { selectedValue = value.toString(); }); }, ), Radio( value: 'Option 3', groupValue: selectedValue, onChanged: (value) { setState(() { selectedValue = value.toString(); }); }, ), ], );
在这个示例中,Column包含了三个单选框,通过 selectedValue 状态来控制哪一个单选框被选中。
Switch部件的构造函数提供了一些参数,用于配置开关的外观和行为。
5.1 构造函数
Switch({ Key? key, required bool value, required ValueChanged<bool?> onChanged, Color? activeColor, Color? activeTrackColor, Color? inactiveThumbColor, Color? inactiveTrackColor, ImageProvider? activeThumbImage, ImageErrorListener? onActiveThumbImageError, ImageProvider? inactiveThumbImage, ImageErrorListener? onInactiveThumbImageError, MaterialTapTargetSize? materialTapTargetSize, DragStartBehavior dragStartBehavior = DragStartBehavior.start, Color? focusColor, Color? hoverColor, Color? splashColor, FocusNode? focusNode, bool autofocus = false, MouseCursor? mouseCursor,})
主要参数说明:
5.2 基本使用
Switch( value: true, onChanged: (value) { // Handle switch state change }, activeColor: Colors.blue,)
在这个示例中,Switch 被创建为已开启状态,当用户点击开关时,onChanged 回调函数将被调用,并传递新的状态。开启状态下,开关的颜色为蓝色。
Slider部件是用于在一个范围内选择值的滑块。
6.1 构造函数
Slider({ Key? key, required double value, required double min, required double max, ValueChanged<double>? onChanged, ValueChanged<double>? onChangeStart, ValueChanged<double>? onChangeEnd, SliderThumbShape? thumb, SliderTickMarkShape? tickMark, SliderTrackShape? track, bool? activeColor, bool? inactiveColor, int? divisions, bool autofocus = false, FocusNode? focusNode, double label, double? semanticFormatterCallback, bool isDiscrete = false, MouseCursor? mouseCursor, ShowValueIndicator? showValueIndicator, OverlayShape? overlayShape, double? trackHeight, bool? primary, Color? overlayColor, Color? valueIndicatorColor, TextStyle? valueIndicatorTextStyle, BoxConstraints? valueIndicatorMaxSize, bool? readOnly,})
常用参数的说明:
6.2 基本使用
Slider( value: _sliderValue, min: 0.0, max: 100.0, onChanged: (value) { setState(() { _sliderValue = value; }); }, ),
这段代码创建了一个滑块,允许用户在0到100的范围内选择一个值。当用户滑动滑块时,onChanged 回调函数被调用,更新 _sliderValue,并且界面会刷新以显示新的值。
TextField(文本输入框):
Form(表单):
Checkbox(复选框):
Radio(单选框):
Switch(开关):
Slider(滑块):
这些输入组件可以根据应用程序的需求进行组合和使用,帮助构建交互丰富的用户界面。选择正确的组件取决于您的应用场景,以提供用户良好的输入和选择体验。