美文网首页iOS 技巧Flutter知识库
Flutter第九章(TextField ,Form、 Tex

Flutter第九章(TextField ,Form、 Tex

作者: 一巴掌拍出两坨脂肪 | 来源:发表于2021-04-27 14:04 被阅读0次
    版权声明:本文为作者原创书籍。转载请注明作者和出处,未经授权,严禁私自转载,侵权必究!!!

    情感语录: 宽容不是道德,而是认识。唯有深刻地认识事物,才能对人和世界的复杂性有了解和体谅,才有不轻易责难和赞美的思维习惯。

    欢迎来到本章节,上一章节我们讲了常用按钮组件的使用,知识点回顾 戳这里 Flutter基础第八章

    本章简要:

    1、TextField 文本框组件

    2、Form、 TextFormField 组件

    3、Checkbox、 CheckboxListTile 多选框组件

    4、Radio 、RadioListTile 单选按钮组件

    5、Switch 、SwitchListTile 开关组件

    一、TextField 文本框组件

    用于 Flutter 中用户输入文本的组件,该组件效果类似 Android 原生中的 EditText 控件一样,且更加灵活和多样性。

    构造函数如下:

      const TextField({
        Key key,
        this.controller,
        this.focusNode,
        this.decoration = const InputDecoration(),
        TextInputType keyboardType,
        this.textInputAction,
        this.textCapitalization = TextCapitalization.none,
        this.style,
        this.strutStyle,
        this.textAlign = TextAlign.start,
        this.textAlignVertical,
        this.textDirection,
        this.readOnly = false,
        this.showCursor,
        this.autofocus = false,
        this.obscureText = false,
        this.autocorrect = true,
        this.maxLines = 1,
        this.minLines,
        this.expands = false,
        this.maxLength,
        this.maxLengthEnforced = true,
        this.onChanged,
        this.onEditingComplete,
        this.onSubmitted,
        this.inputFormatters,
        this.enabled,
        this.cursorWidth = 2.0,
        this.cursorRadius,
        this.cursorColor,
        this.keyboardAppearance,
        this.scrollPadding = const EdgeInsets.all(20.0),
        this.dragStartBehavior = DragStartBehavior.start,
        this.enableInteractiveSelection,
        this.onTap,
        this.buildCounter,
        this.scrollController,
        this.scrollPhysics,
      }) 
    
    TextField 常见属性
            属性                   描述
    
    
        onChanged              文本框内容改变的时候触发的事件
    
        onSubmitted            内容提交(按回车)的回调
    
        decoration             输入前的提示文本等控制,InputDecoration 非常多属性可以配置
    
        border                 配置文本框边框 OutlineInputBorder 配合使用
    
        labelText              浮动提示文本的名称
    
        labelStyle             配置 lable 的样式
    
        obscureText            把文本框框改为密码框
    
        controller             TextEditingController()可以配置默认值显示信息
    
        textAlign              配置内容在水平方向如何显示
    
        focusNode              绑定焦点控制   
    
        textCapitalization     文本框的输入显示格式:
                               sentences    每个句子的第一个字母被转换成大写。
                               characters   大写句子中的所有字符
                               words        对每个单词首字母大写
         
        maxLines               输入框最大的显示行数
    
    
    
        maxLengthEnforced      否允许输入的字符长度超过限定的字符长度
         
        readOnly               是否只读
    
        showCursor             是否显示光标
    
        cursorColor            控制光标颜色
    
        cursorRadius           控制光标圆角
    
        cursorWidth            控制光标宽度
    
        autofocus              是否自动获取焦点
    
        maxLength              最大文本长度.设置此项会让TextField右下角有一个输入数量的统计字符串
    
        style                  TextStyle 配置文本样式
    
        keyboardType           在弹出键盘的时候修改键盘类型,如 TextInputType.number 数字类型
    
        textInputAction        键盘回车键的样式
    
        inputFormatters        限定输入方式,如:WhitelistingTextInputFormatter.digitsOnly 只允许输入数字
    
        onEditingComplete      键盘上按了done
    

    TextField 常常与 InputDecoration 结合使用,所以 InputDecoration 也特别重要。

    InputDecoration 常见属性
         属性                       描述
    
        icon                   文本框外配置前置图标
    
        labelText              配置该项可实现文字和文本框联动特效
    
        labelStyle             配置labelText字体样式
    
        helperText             文本框顶部提示信息
    
        helperStyle            配置 helperText 字体样式
    
        hintText               输入前的提示文字
    
        hintStyle              配置hintText文字样式
    
        errorText              错误提示文字 和 helperText 互斥
    
        errorStyle             错误提示文字的样式
    
        errorMaxLines          提示错误文本的最大行数
    
        contentPadding         设置内距
    
        prefixIcon             文本框内配置前置图标 和 icon属性都非常实用
    
        prefix                 文本框内配置前置自定义Widget
    
        prefixText             文本框内 配置前置文本
    
        prefixStyle            配置 prefixText 的样式
    
        suffixIcon             文本框内配置后缀图标 
    
        suffix                 文本框内配置后缀自定义组件
    
        suffixText             文本框内配置后缀 文本
    
        suffixStyle            配置 suffixText 文字样式
    
        counter                配置右下角计数器,通常情况为null
    
        counterText            配置 counter 文本样式
    
        filled                 是否填充文本框
    
        fillColor              填充文本框的颜色 filled 为true 生效
    
        border                 配置文本框边框 (重要属性)
    
    下面来演示常见用法:

    1、普通文本框

    什么样式都不配置,默认带一个下划线,直接通过 TextField 可以显示一个最简单的文本框:

     TextField()
    

    效果如下:

    TextField1.png

    添加文本框提示信息,和控制输入文字颜色,border:InputBorder.none 可以去掉下划线。

        TextField(
          //文字样式设置
          style: TextStyle(
            color: Colors.red,
            fontSize: 14,
          ),
          //设置边框属性
          //默认的有底部下划线的
          decoration: InputDecoration(
            //输入前的提示文字
            hintText: "请输入留言",
            //去掉下划线
            // border: InputBorder.none,
            //输入前的提示文字样式
            hintStyle: TextStyle(
                fontWeight: FontWeight.w300, color: Colors.green),
          ),
        ),
    

    效果如下:

    TextField2.gif

    2、边框表单、label 特效

    OutlineInputBorder 可以为文本框添加边框。

      TextField(
        decoration: InputDecoration(
          //特效label的信息和样式
          labelText: '账户',
          labelStyle: TextStyle(
            color: Colors.deepPurple,
            fontSize: 14,
          ),
          //输入前的提示文字和样式
          hintText: '请输入账号',
          hintStyle: TextStyle(color: Colors.green,fontSize: 14),
          //输入框添加边框
          border: OutlineInputBorder(
            borderSide: BorderSide(
              color: Colors.blue,
            ),
          ),
        ),
      ),
    

    效果如下:

    TextField3.gif

    3、icon 文本框

    InputDecoration 支持传入一个 icon 属性,传入之后,会在表单的前面显示一个 icon

      Container(
        height: 40,
        child: TextField(
          //设置为密码模式
          obscureText: true,
          decoration: InputDecoration(
              // 边框的内边距
              contentPadding: EdgeInsets.all(10),
              filled: true,
              hintText: '手机号',
              hintStyle : TextStyle(color: Colors.green, fontSize: 14),
              icon: Icon(Icons.phone),
    
              border: OutlineInputBorder(
                borderSide: BorderSide(
                  color: Colors.blue,
                ),
              )
          ),
        ),
      ),
    

    效果如下:


    TextField4.gif

    4、简单综合运用下:

      import 'package:flutter/material.dart';
      import 'package:flutter/services.dart';
      import 'package:flutter_learn/util/ToastUtil.dart';
    
      class FormPagePage extends StatelessWidget {
        @override
        Widget build(BuildContext context) {
    
          String phone = "";
    
          String pass = "";
    
          return MaterialApp(
              debugShowCheckedModeBanner: false,
              home: Scaffold(
                  appBar: AppBar(
                    title: Text("FormPage"),
                  ),
                  body: Container(
                    margin: EdgeInsets.only(left: 20),
                    width: 300,
                    child: ListView(
                      children: <Widget>[
                        Column(
                          children: <Widget>[
    
                            SizedBox(height: 40),
    
                            Container(
                              height: 40,
                              child: TextField(
    
                                controller: TextEditingController(text: "187"),
                                //是否隐藏密码
                                obscureText: false,
                                //绑定焦点控制
                                focusNode: FocusNode(),
                                textCapitalization: TextCapitalization.sentences,
                                //控制光标样式
                                cursorColor: Colors.blue,
                                cursorRadius: Radius.circular(1.0),
                                cursorWidth: 1.0,
                                //最大长度,设置此项会让TextField右下角有一个输入数量的统计字符串
                                maxLines: 1,
                                //输入文本的样式
                                style: TextStyle(fontSize: 14.0, color: Colors.green),
                                //内容改变的回调
                                onChanged: (text) {
                                  print('change $text');
                                  phone = text;
                                },
    
                                decoration: InputDecoration(
                                    labelText: '账户',
                                    labelStyle: TextStyle(
                                      color: Colors.deepPurple,
                                      fontSize: 14,
                                    ),
                                    // 边框的内边距
                                    contentPadding: EdgeInsets.all(10),
                                    filled: true,
                                    hintText: '手机号',
                                    hintStyle : TextStyle(color: Colors.grey, fontSize: 14),
                                    icon: Icon(Icons.phone),
                                    border: OutlineInputBorder(
                                      //边框圆角
                                      borderRadius: BorderRadius.circular(5.0),
                                    )
                                ),
                              ),
                            ),
    
                            SizedBox(height: 10),
    
                            Container(
                              height: 40,
                              child: TextField(
    
                                controller: TextEditingController(),
                                //是否隐藏密码
                                obscureText: true,
                                //绑定焦点控制
                                focusNode: FocusNode(),
                                //控制光标样式
                                cursorColor: Colors.blue,
                                cursorRadius: Radius.circular(1.0),
                                cursorWidth: 1.0,
                                //自动获取焦点
                                maxLines: 1,
                                autofocus: false,
                                //输入文本的样式
                                style: TextStyle(fontSize: 14.0, color: Colors.green),
                                //在弹出键盘的时候修改键盘类型
                                keyboardType: TextInputType.number,
                                //键盘回车键的样式
                                textInputAction: TextInputAction.send,
                                //允许的输入格式 WhitelistingTextInputFormatter.digitsOnly 只允许输入数字
                                inputFormatters: [
                                  WhitelistingTextInputFormatter.digitsOnly
                                ],
                                //内容改变的回调
                                onChanged: (text) {
                                  print('change $text');
                                  pass = text;
                                },
    
                                decoration: InputDecoration(
                                    labelText: '密码',
                                    labelStyle: TextStyle(
                                      color: Colors.deepPurple,
                                      fontSize: 14,
                                    ),
    
                                  // 边框的内边距
                                    contentPadding: EdgeInsets.all(10),
                                    filled: true,
                                    hintText: '密码',
                                    hintStyle : TextStyle(color: Colors.grey, fontSize: 14),
                                    icon: Icon(Icons.lock_outline),
                                    border: OutlineInputBorder(
                                      //边框圆角
                                      borderRadius: BorderRadius.circular(5.0),
                                    )
                                ),
                              ),
                            ),
    
    
                            SizedBox(
                              height: 30,
                            ),
    
                            Container(
                              height: 40,
                              child:
                              RaisedButton(
                                child:
                                Text('登录', style: TextStyle(color: Colors.white)),
                                color: Colors.green,
                                shape: RoundedRectangleBorder(
                                  borderRadius: BorderRadius.circular(20),
                                ),
                                onPressed: () {
                                  ToastUtil.show("账号:$phone"+ " 密码:$pass");
                                },
                              ),
                            ),
    
                          ],
                        )
                      ],
                    ),
                  )));
        }
      }
    

    效果如下:

    TextField5.gif

    效果还是不错的,更多美美的特效,自己去 DIY 吧 哈哈。

    二、Form、 TextFormField 组件

    1、Form 组件

    Flutter中的Form组件和html中的<form></form>的作用类似,都是起到了一个容器的作用。实际业务中,在正式向服务器提交数据前,都会对各个输入框数据进行合法性校验,但是对每一个TextField都分别进行校验将会是一件很麻烦的事。还有,如果用户想清除一组TextField的内容,除了一个一个清除有没有什么更好的办法呢?为此,Flutter提供了一个Form 组件,它可以对输入框进行分组,然后进行一些统一操作,如输入内容校验、输入框重置以及输入内容保存。

    构造函数:

      const Form({
        Key key,
        @required this.child,
        this.autovalidate = false,
        this.onWillPop,
        this.onChanged,
      })
    
    Form 常用属性:
        属性                    描述
    
        autovalidate            是否自动校验输入内容。
    
        onWillPo                此属性通常用于拦截返回按钮。
    
        onChanged               Form的任意一个子FormField内容发生变化时会触发此回调。
    
    2、TextFormField 组件

    Flutter提供了一个TextFormField 组件,它继承自 FormField类,也是 TextField 的一个包装类,所以除了 FormField 定义的属性之外,它还包括TextField 的属性。FormState 为 Form 的State 类,可以通过Form.of()GlobalKey 获得。我们可以通过它来对 FormField 进行统管理。我们看看其常用的三个方法:

    FormState.validate():调用此方法后,会调用Form子孙FormField的validate回调,如果有一个校验失败,则返回false,所有校验失败项都会返回用户返回的错误提示。

    FormState.save():调用此方法后,会调用Form子孙FormField的save回调,用于保存表单内容。

    FormState.reset():调用此方法后,会将子孙FormField的内容清空。

    FormField 构造函数

        const FormField({
          ...
          FormFieldSetter<T> onSaved, //保存回调
          FormFieldValidator<T>  validator, //验证回调
          T initialValue, //初始值
          bool autovalidate = false, //是否自动校验。
        })
    

    特别注意的是在 TextFormField 中没有 onChanged ()回调函数给我们取出输入框中的值,必须使用 controller 方式 添加监听。

    简单运用:

    我们修改一下上面用户登录的示例,在提交之前校验:1.用户名不能为空,如果为空则提示“用户名不能为空”。2.密码不能小于6位,如果小于6为则提示“密码不能少于6位”。

      import 'package:flutter/cupertino.dart';
      import 'package:flutter/material.dart';
      import 'package:flutter/services.dart';
      import 'package:flutter_learn/util/ToastUtil.dart';
      
      class FormPagePage extends StatelessWidget {
        @override
        Widget build(BuildContext context) {
          return MaterialApp(
              debugShowCheckedModeBanner: false,
              home: Scaffold(
                  appBar: AppBar(
                    title: Text("FormPage"),
                  ),
                  body: Container(
                    margin: EdgeInsets.only(left: 20),
                    width: 300,
                    child: ListView(
                      children: <Widget>[
                        ///文本框组件
                        //TextFieldWidget()
                     
                        ///表单提交校验
                        FormFieldWidget()
                      ],
                    ),
                  )));
        }
      }
    
    
      //登录验证的表单
      class FormFieldWidget extends StatefulWidget {
        @override
        _FormFieldWidgetState createState() => _FormFieldWidgetState();
      }
      
      class _FormFieldWidgetState extends State<FormFieldWidget> {
      
        TextEditingController _unameController = new TextEditingController();
        TextEditingController _pwdController = new TextEditingController();
      
        GlobalKey _formKey= new GlobalKey<FormState>();
      
        String userName = "";
      
        String userPass = "";
      
        @override
        void initState() {
          super.initState();
      
          //添加监听
          _unameController.addListener((){
            userName =_unameController.text;
          });
      
          _pwdController.addListener((){
            userPass = _pwdController.text;
          });
        }
      
      
        @override
        Widget build(BuildContext context) {
          return Padding(
            padding:  EdgeInsets.symmetric(vertical: 16.0, horizontal: 24.0),
            child: Form(
              key: _formKey, //设置globalKey,用于后面获取FormState
              autovalidate: true, //开启自动校验
              child: Column(
                children: <Widget>[
                  TextFormField(
                      autofocus: true,
                      controller: _unameController,
      
      
                      decoration: InputDecoration(
                          labelText: "用户名",
                          hintText: "用户名或邮箱",
                          icon: Icon(Icons.person)
                      ),
                      // 校验用户名
                      validator: (v) {
                        return v
                            .trim()
                            .length > 0 ? null : "用户名不能为空";
                      }
                  ),
                  TextFormField(
                      controller: _pwdController,
                      decoration: InputDecoration(
                          labelText: "密码",
                          hintText: "您的登录密码",
                          icon: Icon(Icons.lock)
                      ),
                      obscureText: true,
                      //校验密码
                      validator: (v) {
                        return v
                            .trim()
                            .length > 5 ? null : "密码不能少于6位";
                      }
                  ),
                  // 登录按钮
                  Padding(
                    padding: const EdgeInsets.only(top: 28.0),
                    child: Row(
                      children: <Widget>[
                        Expanded(
                          child: RaisedButton(
                            padding: EdgeInsets.all(15.0),
                            child: Text("登录"),
                            color:Colors.blue,
                            textColor: Colors.white,
                            onPressed: () {
      
                              // 通过_formKey.currentState 获取FormState后,
                              // 调用validate()方法校验用户名密码是否合法,校验
                              // 通过后再提交数据。
      
                              FormState state = (_formKey.currentState as FormState);
                              if(state.validate()){
      
                                ToastUtil.show("账号:$userName" + " 密码:$userPass");
      
                                //验证通过提交数据,并清空表单
                                  //state.reset();
                              }
                            },
                          ),
                        ),
                      ],
                    ),
                  )
                ],
              ),
            ),
          );
        }
      }
    

    效果如下:

    表单验证.gif

    三、Checkbox、 CheckboxListTile 多选框组件

    1、Checkbox组件

    Checkbox复选框按钮有自带的一个动画效果,但是它并未像其他组件那么完美,没有提示文本信息的配置,因此要往往需要和其他组件组合使用

    构造函数:

      const Checkbox({
        Key key,
        @required this.value,
        this.tristate = false,
        @required this.onChanged,
        this.activeColor,
        this.checkColor,
        this.materialTapTargetSize,
      }) 
    
    Checkbox 常见属性:
        属性                 描述
    
        value                true 或者 false
    
        onChanged            改变的时候触发的事件
    
        activeColor          选中的颜色、背景颜色
    
        checkColor           选中的颜色、Checkbox 里面对号的颜色
    

    简单运用:

        Row(
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            Checkbox(
                value: _isSelected,
                onChanged: (v) {
                  setState(() {
                    this._isSelected = v;
                  });
                },
                activeColor: Colors.red,
                checkColor: Colors.blue),
    
            SizedBox(width: 50),
            Checkbox(
              activeColor: Colors.green,
              checkColor: Colors.yellow,
              value: this._isSelected,
              onChanged: (value) {
                setState(() {
                  this._isSelected = value;
                });
              },
            ),
            Container(
              child: Text(this._isSelected ? '选中' : '未选中'),
            ),
          ],
        )
    

    效果如下:

    Checkbox.gif
    2、CheckboxListTile 组件

    CheckboxListTile 提供了类似 ListTile 样式的多选框,使用它可以很轻松实现类似商品购物栏样式。

    CheckboxListTile 常见属性:
        属性                 描述
    
        value                true 或者 false
    
        onChanged            改变的时候触发的事件
    
        activeColor          选中的颜色、背景颜色
    
        title                标题
    
        subtitle             二级标题
    
        secondary            配置图标或者图片
    
        selected             选中的时候文字颜色是否跟着改变
    

    简单运用:

       CheckboxListTile(
          title: Text('标题'),
          subtitle: Text('二级标题'),
          activeColor: Colors.pink,
          selected: this._isSelected,
          secondary: Image.asset(
            "images/mm.jpg",
            fit: BoxFit.cover,
            // color: Colors.grey[200],
            width: 60,
          ),
          value: this._isSelected,
          onChanged: (value) {
            setState(() {
              this._isSelected = value;
            });
          },
        ),
    

    效果如下:

    CheckboxListTile.gif

    四、Radio 、RadioListTile 单选按钮组件

    1、Radio 组件:

    Radio单独使用和 Checkbox 是一样的效果。Radio 往往都是需要多个 一起使用,因此多个 Radio 往往绑定的是同一个 state。多个Radio一起使用就形成了RadioGroup,而 RadioGroup 怎么去区分众多中的 Radio 是和自己一组的呢?于是 Radio 要实现单选效果就多了一个必传属性groupValue,只要 groupValue 指向同一个变量,就说明这些 Radio 是同一个 group 中的,就只会有一个被选中。

    构造函数:

      const Radio({
        Key key,
        @required this.value,
        @required this.groupValue,
        @required this.onChanged,
        this.activeColor,
        this.materialTapTargetSize,
      }) : super(key: key);
    
    Radio常用属性:
        属性            描述
    
        value           单选的值
    
        onChanged       改变时触发
    
        activeColor     选中的颜色、背景颜色
    
        groupValue      选择组的值
    

    简单运用:

        Row(
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            Radio(
              value: 0,
              activeColor: Colors.blue,
    
              // 绑定_sex变量的 的 Radio 为同一 Group.
    
              groupValue: this._sex,
              onChanged: (value) {
                setState(() {
                  this._sex = value;
                });
              },
            ),
            Text('男'),
            Radio(
              value: 1,
              activeColor: Colors.blue,
              groupValue: this._sex,
              onChanged: (value) {
                setState(() {
                  this._sex = value;
                });
              },
            ),
            Text('女'),
          ],
        ),
        Row(
          children: <Widget>[
            Text('性别:${this._sex} : ${this._sex == 0 ? '男' : '女'}'),
          ],
        ),
    

    效果如下:

    Radio.gif
    2、RadioListTile 组件:

    同 CheckboxListTile 一样,也是基于 ListTile 实现,不过会多一个 groupValue 属性,同理 groupValue 绑定统一的变量的成 RadioGroup 组,实现选择互斥,只能选中一个。

    构造函数:

      const RadioListTile({
        Key key,
        @required this.value,
        @required this.groupValue,
        @required this.onChanged,
        this.activeColor,
        this.title,
        this.subtitle,
        this.isThreeLine = false,
        this.dense,
        this.secondary,
        this.selected = false,
        this.controlAffinity = ListTileControlAffinity.platform,
      })
    
    RadioListTile 常用属性:
        属性            描述
    
        value           true 或者 false
    
    
        onChanged       改变的时候触发的事件
    
        activeColor     选中的颜色、背景颜色
    
        title           标题
    
        subtitle        二级标题
    
        secondary       配置图标或者图片
    
        groupValue      选择组的值
        
        selected        是否选中
    

    简单运用:

        RadioListTile(
          activeColor: Colors.pink,
          title: Text('标题'),
          subtitle: Text('二级标题'),
          secondary:  Image.asset(
            "images/mm.jpg",
            fit: BoxFit.cover,
            // color: Colors.grey[200],
            width: 60,
          ),
          selected: this._sex == 0,
          value: 0,
          groupValue: this._sex,
          onChanged: (value) {
            setState(() {
              this._sex = value;
            });
          },
        ),
    
        Divider(height: 1),
    
        RadioListTile(
          activeColor: Colors.pink,
          title: Text('标题'),
          subtitle: Text('二级标题'),
          secondary:  Image.asset(
            "images/mm.jpg",
            fit: BoxFit.cover,
            // color: Colors.grey[200],
            width: 60,
          ),
          selected: this._sex == 1,
          value: 1,
          groupValue: this._sex,
          onChanged: (value) {
            setState(() {
              this._sex = value;
            });
          },
        ),
    

    效果如下:

    RadioListTile.gif

    五、Switch 、SwitchListTile 开关组件

    1、Switch 组件

    Switch 组件比较简单,Switch 是 Android 风格的样式,IOS风格 使用 CupertinoSwitch 组件。

    构造函数:

      const Switch({
        Key key,
        @required this.value,
        @required this.onChanged,
        this.activeColor,
        this.activeTrackColor,
        this.inactiveThumbColor,
        this.inactiveTrackColor,
        this.activeThumbImage,
        this.inactiveThumbImage,
        this.materialTapTargetSize,
        this.dragStartBehavior = DragStartBehavior.start,
      }) 
    
    Switch 常用属性:
        属性                 描述
    
        value                是否选中
          
        onChanged            改变时触发
    
        activeColor          选中的颜色、背景颜色
    
        activeThumbImage     原点还支持图片,激活时的效果
    
        activeTrackColor     激活时横条的颜色
    
        inactiveThumbColor   非激活时原点的颜色
    
        inactiveThumbImage   非激活原点的图片效果
    
        inactiveTrackColor   非激活时横条的颜色
    

    简单运用:

        Container(
          width: 60,
          child: Switch(
            //当前状态
            value: _switchSelected,
            // 激活时原点颜色
            activeColor: Colors.blue,
            activeTrackColor: Colors.blue.shade50,
            inactiveTrackColor: Colors.blue.shade50,
            onChanged: (value) {
              //重新构建页面
              setState(() {
                _switchSelected = value;
              });
            },
          ),
        ),
    
        SizedBox(
          height: 20,
        ),
    
    
        SizedBox(
          height: 20,
          child: Text("IOS风格"),
        ),
    
        CupertinoSwitch(
          value: _switchSelected,
          // 激活时原点颜色
          activeColor: Colors.blue,
          onChanged: (value) {
            //重新构建页面
            setState(() {
              _switchSelected = value;
            });
          },
        ),
    

    效果如下:

    Switch&&CupertinoSwitch.gif
    2、SwitchListTile 组件

    SwitchListTile 组件可以快速实现一些像设置界面的开关场景。

    构造函数:

      const SwitchListTile({
        Key key,
        @required this.value,
        @required this.onChanged,
        this.activeColor,
        this.activeTrackColor,
        this.inactiveThumbColor,
        this.inactiveTrackColor,
        this.activeThumbImage,
        this.inactiveThumbImage,
        this.title,
        this.subtitle,
        this.isThreeLine = false,
        this.dense,
        this.secondary,
        this.selected = false,
      }) 
    
    SwitchListTile 常用属性
        属性                 描述
    
        value                是否选中的改变值。
    
        onChanged            改变时触发
    
        activeColor          选中的颜色、背景颜色
    
        activeThumbImage     原点还支持图片,激活时的效果。
    
        activeTrackColor     激活时横条的颜色。
    
        inactiveThumbColor   非激活时原点的颜色。
    
        inactiveThumbImage   非激活原点的图片效果。
    
        inactiveTrackColor   非激活时横条的颜色。
    
        title                一级标题
    
        subtitle,            二级标题
    
        isThreeLine          是否三行文本高度显示
    
        selected             是否选中
    

    简单运用:

       SwitchListTile(
          secondary:  Icon(Icons.wifi),
          //一级标题
          title:  Text('wifi开关'),
          //二级标题
          subtitle: Text("选中可以打开wifi"),
          value: _switchSelected,
          //添加三行文本显示高度
          isThreeLine: true,
          onChanged: (bool value) {
            setState(() {
              _switchSelected = !_switchSelected;
            });
          },
        ),
    

    效果如下:

    SwitchListTile.gif

    在 Android 原生中要实现这些炫酷的效果,自带控件是不可能的,基本都要去自定义View,花销时间巨大,成本过高! 而在Flutter 中这一切都显得那么简单易用,你有没有被Flutter 中这些炫酷的效果吸引到呢?

    由于篇幅已经相当长了,且涉及到的知识点较多~~~~~~本章节到此结束,又到了说再见的时候了,如果你喜欢请留下你的小红星,你们的支持才是创作的动力,如有错误,请热心的你留言指正, 谢谢大家观看,下章再会 O(∩_∩)O

    实例源码地址: https://github.com/zhengzaihong/flutter_learn

    相关文章

      网友评论

        本文标题:Flutter第九章(TextField ,Form、 Tex

        本文链接:https://www.haomeiwen.com/subject/jnxkectx.html