设计给的效果如下:

拿到设计后,先把整体拆分成几个部分:

  1. “文本输入框”,使用文本字段(TextField)组件实现的输入框。
  2. “状态指示条”,使用容器(Container)组件实现带颜色的长方形。

然后就可以开始进行编码了。

第1步:绘制组件树

第2步:实现“文本输入框”

Flutter的布局代码嵌套非常深,为了代码的可读性,你可以先把一部分没有依赖的纯样式代码提取出来。

import 'package:flutter/material.dart';// 文字样式(`TextStyle`)组件,一个不透明的对象,用于确定文本的大小,位置和呈现。
/// 文本域(`TextField`)组件使用的样式。
final TextStyle _textFieldStyle = TextStyle(// 字体大小。fontSize: 22.0,// 字母间距。letterSpacing: 0.78,// 字体系列。fontFamily: 'BebasNeueBold',// 颜色。color: const Color(0xFF4A4A4A),
);/// 输入装饰(`InputDecoration`)组件的提示样式(`hintStyle`)属性值。
final TextStyle _hintStyle = TextStyle(fontSize: 16.0,color: const Color(0xFF9B9B9B),
);

定义一下该自定义组件构建时需要的成员变量,并在默认构建函数中传递一下调用者提供的参数。

/// 自定义的登录表单字段组件。
class LoginFormField extends StatefulWidget {/// 字段内的提示文字。final String hintText;/// 文本字段的控制器。final TextEditingController textEditingController;/// 文本字段的最大长度。final int maxLength;/// 文本字段的最小长度。final int minLength;/// 文本字段长度合理时的回调函数。final Function legitimateCallback;/// 文本字段长度不合理时的回调函数。final Function illegalCallback;LoginFormField({@requiredthis.hintText,this.textEditingController,this.maxLength,this.minLength,this.legitimateCallback,this.illegalCallback,});@override_LoginFormFieldState createState() => _LoginFormFieldState();
}

先写好一个垂直(Column)组件,接下来会在垂直(Column)组件中具体实现“文本输入框”和“状态指示条”。

/// 与自定义的登录表单字段组件关联的状态子类。
class _LoginFormFieldState extends State<LoginFormField> {/// 文本字段下方的提示颜色。Color inputColor;@overridevoid initState() {super.initState();inputColor = Color(0xFFC5C5C5);}@overrideWidget build(BuildContext context) {return Column(children: <Widget>[// TODO: 实现“文本输入框”。// TODO: 第3步:实现“状态指示条”。],);}
}

通过设置文本字段(TextField)组件的属性和方法,实现UI图的效果。同时通过简单的文本长度来校验数据是否合法,当前你可以添加更多的校验逻辑,来满足业务需求。

        // TODO: 实现“文本输入框”。// 文本字段(`TextField`)组件,允许用户使用硬件键盘或屏幕键盘输入文本。TextField(// 控制器属性,控制正在编辑的文本。controller: widget.textEditingController,// 光标颜色属性,绘制光标时使用的颜色。cursorColor: const Color(0xFFFF6B47),// 光标宽度属性,光标的厚度,默认是2.0。cursorWidth: 2.0,// 样式属性,用于正在编辑的文本的样式。style: _textFieldStyle,// 键盘类型属性,用于编辑文本的键盘类型。keyboardType: TextInputType.number,// 装饰(`decoration`)属性,在文本字段周围显示的装饰。// 输入装饰(`InputDecoration`)组件。decoration: InputDecoration(// 边框属性,装饰的容器周围绘制的形状。border: InputBorder.none,// 填充属性,如果为`true`,则装饰的容器将填充fillColor颜色。filled: true,// 填充颜色属性,填充装饰容器的颜色。fillColor: const Color(0xFFF4F3F4),// 是密集属性,输入子项是否是密集形式的一部分(即使用较少的垂直空间)。isDense: true,// 提示样式属性,用于提示文本(`hintText`)的样式。hintStyle: _hintStyle,// 提示文本属性,提示字段接受哪种输入的文本。hintText: widget.hintText,),// 在改变属性,当正在编辑的文本发生更改时调用。onChanged: (value) {// 当前文本字段中值的长度。int fieldValue = value.trim().length;if (fieldValue == 0) {inputColor = Color(0xFFC5C5C5);} else if (fieldValue > widget.maxLength) {inputColor = Color(0xFFFF3E44);} else {inputColor = Color(0xFF00CED2);}setState(() {});// 当前文本字段中值的长度符合给定范围时调用回调函数。if (fieldValue > widget.minLength-1 && fieldValue < widget.maxLength+1) {widget.legitimateCallback();} else {widget.illegalCallback();}},),

第3步:实现“状态指示条”

最后使用容器(Container)组件实现2条简单的带颜色的长方形。

        // TODO: 第3步:实现“状态指示条”。Container(height: 2.0,color: const Color(0xFF242406),),Container(height: 2.0,color: inputColor,),

第4步:还原效果

Flutter布局锦囊---带彩条的文本字段相关推荐

  1. Flutter布局锦囊---蜡笔画的表单

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: "手机号输入框",使用自定义的登录表单字段组件实现的输入框. "验证码输入框",使用自定义的登录表单验 ...

  2. Flutter布局锦囊---完善信息页

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: "用户昵称输入",获取用户输入的昵称信息. "用户头像选取",获取用户选取作为头像的图片. " ...

  3. Flutter布局锦囊---绑定手机页

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: "顶部导航栏",标题+取消按钮+跳过按钮的应用栏. "手机号输入框",用于获取手机号码的圆角边框输入字 ...

  4. Flutter布局锦囊---手机号登录页

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: "运营位",使用自定义的旋转木马滑块组件实现可以滚动的运营位. "登录表单",使用自定义的登录表单组件 ...

  5. Flutter布局锦囊---圆框的表单字段

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: "黑色圆角边框",因为文本字段(TextField)组件的没有符合需求的样式,所以要自己做一个边框. "文本输入 ...

  6. Flutter布局锦囊---带输入字段的应用栏

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: "堆栈容器",使用大小框(SizedBox)和堆栈(Stack)组件搞的容器,用于实现层次结构. "下层的导航& ...

  7. Flutter布局锦囊---验证码倒计时

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: "获取验证码按钮",可以通过点击按钮来获取验证码. 然后就可以开始进行编码了. 第1步:绘制组件树 第2步:实现" ...

  8. Flutter布局锦囊---涂鸦风格按钮

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: "可点击框",使用堆栈(Stack)组件布局的可点击区域. "底部矩形",用来衬托"主要矩形 ...

  9. Flutter布局锦囊---男女性别单选

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: "点击操作",感应用户选择性别的区域. "选择性别男",性别男的选择区域,点击会更新图片和样式. &q ...

最新文章

  1. 软件开发人员该如何深入理解自己的代码
  2. OpenCV 图像旋转
  3. flex+hibernate 中java的pojo与as的pojo的映射问题
  4. 生成pfx文件需要在服务器上执行,PEM文件和private.key文件生成IIS服务器所需的pfx文件(配置SSL用)...
  5. sata接口测试软件,方便用户,技嘉放出6系列主板SATA接口检测软件
  6. idea创建maven web项目
  7. python QTreeWidgetItem下面有几个子tree_python-nlp ch1笔记:nlp的基础应用、高级应用、python优势、nltk环境搭建...
  8. 信安教程第二版-第24章工控安全需求分析与安全保护工程
  9. “壕”无人性!黄金版iPhone 13 Pro售价27万元起
  10. python 引入同一路径的类_Python实现Wordcloud生成词云图的示例
  11. 8.15 SNAIL:神经注意力元学习
  12. 黄聪:WordPress默认编辑器可视化切换不见了,非插件导致消失问题
  13. 百度前端学院--小薇学院--任务05
  14. 计算机专业设计(论文)内容及要求,计算机专业毕业设计要求.doc
  15. 纹理压缩格式DXT/PVR/ETC编码
  16. 计算机中央的处理器由什么构成,计算机中央处理器CPU的由什么组成
  17. 头条是一款遵循材料设计(Material Design)的第三方今日头条客户端, 聚合了新闻/段子/图片/视频/头条号内容, 没有广告, 仅仅只有存粹的阅读, 不断完善中, 采用 MVP + RxJa
  18. 【C++编程语言】严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C3848 具有类型“const MyCompare”的表达式会丢失一些 const-volatile 限定符以调用“bool
  19. console用法java_Java Console printf(String, Object)用法及代码示例
  20. 教你如何查看Ubuntu版本

热门文章

  1. 操作系统 第二章 进程管理
  2. 人脸关键点:MTCNN-Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks
  3. Python之定义默认参数
  4. 目标检测——对数据进行EDA分析的学习笔记
  5. tkinter Canvas画图片大坑总结
  6. 东大OJ-1391-Big big Power
  7. 多目标跟踪数据集 :mot16、mot17数据集介绍
  8. c/c++教程 - 2.4.2.3~4 拷贝构造函数的调用时机,构造函数调用规则
  9. 【LINQ】Linq to SQL -- Select语句
  10. ActiveMQ 消息游标(Message Cursors)