老孟导读:大家好,这是【Flutter实战】系列文章的第二篇,这一篇讲解文本组件,文本组件包括文本展示组件(Text和RichText)和文本输入组件(TextField),基础用法和五个案例助你快速掌握。

第一篇链接:【Flutter实战】移动技术发展史

Text

Text是显示文本的组件,最常用的组件,没有之一。基本用法如下:

  1. Text('老孟')

注意:Text组件一定要包裹在Scaffold组件下,否则效果如下:

文本的样式在style中设置,类型为TextStyleTextStyle中包含很多文本样式属性,下面介绍一些常用的。

设置文本大小和颜色:

  1. Text('老孟',style: TextStyle(color: Colors.red,fontSize: 20),),

上面黑色的字体为没有设置的效果,作为对比。

设置字体粗细:

  1. Text('老孟',style: TextStyle(fontWeight: FontWeight.bold))

字体粗细共有9个级别,为w100w900FontWeight.boldw700

设置斜体:

  1. Text('老孟',style: TextStyle(fontStyle: FontStyle.italic,))

设置自定义的字体:

  1. 首先下载字体库(比如中华字体库)
  2. 将字体文件拷贝的项目中,一般目录是:assets/fonts/,assets和fonts都需要手动创建,此目录不是必须的,而是约定俗成,资源一般都放在assets目录下。
  3. 配置pubspec.yaml
  1. fonts:
  2. - family: maobi
  3. fonts:
  4. - asset: assets/fonts/maobi.ttf

maobi:是自己对当前字体的命名,有意义即可。

asset:字体文件的目录。

使用:

  1. Text('老孟', style: TextStyle(fontFamily: 'maobi',)),

设置对齐方式:

  1. Container(
  2. height: 100,
  3. width: 200,
  4. color: Colors.blue.withOpacity(.4),
  5. child: Text('老孟', textAlign: TextAlign.center),
  6. ),

textAlign只是控制水平方向的对齐方式,值说明如下:

  • left:左对齐
  • right:右对齐
  • center:居中
  • justify:两端对齐,此属性中文存在bug(Flutter版本:1.17.3)也可以在官方issue中关注此问题
  • start:前端对齐,和TextDirection属性有关,如果设置TextDirection.ltr,则左对齐,设置TextDirection.rtl则右对齐。
  • end:末端对齐,和TextDirection属性有关,如果设置TextDirection.ltr,则右对齐,设置TextDirection.rtl则左对齐。

设置文本自动换行:

  1. Container(
  2. height: 100,
  3. width: 200,
  4. color: Colors.blue.withOpacity(.4),
  5. child: Text('老孟,专注分享Flutter技术和应用实战',softWrap: true,),
  6. )

文本超出范围时的处理:

  1. Container(
  2. height: 100,
  3. width: 200,
  4. color: Colors.blue.withOpacity(.4),
  5. child: Text('老孟,专注分享Flutter技术和应用实战',overflow: TextOverflow.ellipsis,),
  6. )

溢出的处理方式:

  • clip:直接裁剪。
  • fade:越来越透明。
  • ellipsis:省略号结尾。
  • visible:依然显示,此时将会溢出父组件。

设置全局字体样式:

MaterialApptheme中设置如下

  1. MaterialApp(
  2. title: 'Flutter Demo',
  3. theme: ThemeData(
  4. ...
  5. textTheme: TextTheme(
  6. bodyText2: TextStyle(color: Colors.red,fontSize: 24),
  7. )
  8. ),
  9. home: Scaffold(
  10. body: TextDemo(),
  11. ),
  12. )

Text组件默认为红色,

  1. Text('老孟'),
  2. Text('老孟',style: TextStyle(color: Colors.blue,fontSize: 20),),

RichText

RichText的属性和Text基本一样,使用如下:

  1. RichText(
  2. text: TextSpan(
  3. style: DefaultTextStyle.of(context).style,
  4. children: <InlineSpan>[
  5. TextSpan(text: '老孟', style: TextStyle(color: Colors.red)),
  6. TextSpan(text: ','),
  7. TextSpan(text: '专注分享Flutter技术和应用实战'),
  8. ]),
  9. )

TextField

TextField是文本输入组件,即输入框,常用组件之一。基本用法:

  1. TextField()

不需要任何参数,一个最简单的文本输入组件就出来了,效果如下:

decoration是TextField组件的装饰(外观)参数,类型是InputDecoration。

icon显示在输入框的前面,用法如下:

  1. TextField(
  2. decoration: InputDecoration(
  3. icon: Icon(Icons.person),
  4. ),
  5. )

当输入框是空而且没有焦点时,labelText显示在输入框上边,当获取焦点或者不为空时labelText往上移动一点,labelStyle参数表示文本样式,具体参考TextStyle, 用法如下:

  1. TextField(
  2. decoration: InputDecoration(
  3. labelText: '姓名:',
  4. labelStyle: TextStyle(color:Colors.red)
  5. ),
  6. )

hasFloatingPlaceholder参数控制当输入框获取焦点或者不为空时是否还显示labelText,默认为true,显示。

helperText显示在输入框的左下部,用于提示用户,helperStyle参数表示文本样式,具体参考TextStyle用法如下:

  1. TextField(
  2. decoration: InputDecoration(
  3. helperText: '用户名长度为6-10个字母',
  4. helperStyle: TextStyle(color: Colors.blue),
  5. helperMaxLines: 1
  6. ),
  7. )

hintText是当输入框为空时的提示,不为空时不在显示,用法如下:

  1. TextField(
  2. decoration: InputDecoration(
  3. hintText: '请输入用户名',
  4. hintStyle: TextStyle(color: Colors.grey),
  5. hintMaxLines: 1
  6. ),
  7. )

errorText显示在输入框的左下部,默认字体为红色,用法如下:

  1. TextField(
  2. decoration: InputDecoration(
  3. errorText: '用户名输入错误',
  4. errorStyle: TextStyle(fontSize: 12),
  5. errorMaxLines: 1,
  6. errorBorder: OutlineInputBorder(borderSide: BorderSide(color: Colors.red)),
  7. ),
  8. )

prefix系列的组件是输入框前面的部分,用法如下:

  1. TextField(
  2. decoration: InputDecoration(
  3. prefixIcon: Icon(Icons.person)
  4. ),
  5. )

注意prefix和icon的区别,icon是在输入框边框的外部,而prefix在里面。

suffix和prefix相反,suffix在输入框的尾部,用法如下:

  1. TextField(
  2. decoration: InputDecoration(
  3. suffixIcon: Icon(Icons.person)
  4. ),
  5. )

counter组件统计输入框文字的个数,counter仅仅是展示效果,不具备自动统计字数的功能, 自动统计字数代码如下:

  1. var _textFieldValue = '';
  2. TextField(
  3. onChanged: (value){
  4. setState(() {
  5. _textFieldValue = value;
  6. });
  7. },
  8. decoration: InputDecoration(
  9. counterText: '${_textFieldValue.length}/32'
  10. ),
  11. )

filled为true时,输入框将会被fillColor填充,仿QQ登录输入框代码如下:

  1. Container(
  2. height: 60,
  3. width: 250,
  4. child: TextField(
  5. decoration: InputDecoration(
  6. fillColor: Color(0x30cccccc),
  7. filled: true,
  8. enabledBorder: OutlineInputBorder(
  9. borderSide: BorderSide(color: Color(0x00FF0000)),
  10. borderRadius: BorderRadius.all(Radius.circular(100))),
  11. hintText: 'QQ号/手机号/邮箱',
  12. focusedBorder: OutlineInputBorder(
  13. borderSide: BorderSide(color: Color(0x00000000)),
  14. borderRadius: BorderRadius.all(Radius.circular(100))),
  15. ),
  16. ),
  17. )

controller是输入框文本编辑的控制器,可以获取TextField的内容、设置TextField的内容,下面将输入的英文变为大写:

  1. TextEditingController _controller;
  2. @override
  3. void initState() {
  4. super.initState();
  5. _controller = TextEditingController()
  6. ..addListener(() {
  7. //获取输入框的内容,变为大写
  8. _controller.text = _controller.text.toUpperCase();
  9. });
  10. }
  11. @override
  12. Widget build(BuildContext context) {
  13. return TextField(
  14. controller: _controller,
  15. );
  16. }
  17. @override
  18. dispose() {
  19. super.dispose();
  20. _controller.dispose();
  21. }

有时输入框后面带有“清除”功能,需要controller来实现。如果需要2个TextField的内容进行同步,只需要给2个TextField设置同一个controller即可实现。

keyboardType参数控制软键盘的类型,说明如下:

  • text:通用键盘。
  • multiline:当TextField为多行时(maxLines设置大于1),右下角的为“换行” 按键。
  • number:数字键盘。
  • phone:手机键盘,比数字键盘多"*"和 "#"。
  • datetime:在ios上和text一样,在android上出现数字键盘、":"和 "-"。
  • emailAddress:邮箱键盘,有"@" 和 "."按键。
  • url:url键盘,有"/" 和 "."按键。
  • visiblePassword:既有字幕又有数字的键盘。

textInputAction参数控制软键盘右下角的按键,说明如下:

  • none:android上显示返回键,ios不支持。
  • unspecified:让操作系统自己决定哪个合适,一般情况下,android显示“完成”或者“返回”。
  • done:android显示代表“完成”的按钮,ios显示“Done”(中文:完成)。
  • go:android显示表达用户去向目的地的图标,比如向右的箭头,ios显示“Go”(中文:前往)。
  • search:android显示表达搜索的按钮,ios显示"Search"(中文:搜索)。
  • send:android显示表达发送意思的按钮,比如“纸飞机”按钮,ios显示"Send"(中文:发送)。
  • next:android显示表达“前进”的按钮,比如“向右的箭头”,ios显示"Next"(中文:下一项)。
  • previous:android显示表达“后退”的按钮,比如“向左的箭头”,ios不支持。
  • continueAction:android 不支持,ios仅在ios9.0+显示"Continue"(中文:继续)。
  • join:Android和ios显示"Join"(中文:加入)。
  • route:android 不支持,ios显示"Route"(中文:路线)。
  • emergencyCall:android 不支持,ios显示"Emergency Call"(中文:紧急电话)。
  • newline:android显示表达“换行”的按钮,ios显示”换行“。

大家可能发现了,Android上显示的按钮大部分是不确定的,比如next有的显示向右的箭头,有的显示前进,这是因为各大厂商对Android ROM定制引发的。

textCapitalization参数是配置键盘是大写还是小写,仅支持键盘模式为text,其他模式下忽略此配置,说明如下:

  • words:每一个单词的首字母大写。
  • sentences:每一句话的首字母大写。
  • characters:每个字母都大写
  • none:都小写

这里仅仅是控制软键盘是大写模式还是小写模式,你也可以切换大小写,系统并不会改变输入框内的内容。

textAlignVertical表示垂直方向的对齐方式,textDirection表示文本方向,用法如下:

  1. TextField(
  2. textAlignVertical: TextAlignVertical.center,
  3. textDirection: TextDirection.rtl,
  4. )

toolbarOptions表示长按时弹出的菜单,有copycutpasteselectAll,用法如下:

  1. TextField(
  2. toolbarOptions: ToolbarOptions(
  3. copy: true,
  4. cut: true,
  5. paste: true,
  6. selectAll: true
  7. ),
  8. )

cursor表示光标,用法如下:

  1. TextField(
  2. showCursor: true,
  3. cursorWidth: 3,
  4. cursorRadius: Radius.circular(10),
  5. cursorColor: Colors.red,
  6. )

效果如下:

将输入框设置为密码框,只需obscureText属性设置true即可,用法如下:

  1. TextField(
  2. obscureText: true,
  3. )

通过inputFormatters可以限制用户输入的内容,比如只想让用户输入字符,设置如下:

  1. TextField(
  2. inputFormatters: [
  3. WhitelistingTextInputFormatter(RegExp("[a-zA-Z]")),
  4. ],
  5. )

这时用户是无法输入数字的。

onChanged是当内容发生变化时回调,onSubmitted是点击回车或者点击软键盘上的完成回调,onTap点击输入框时回调,用法如下:

  1. TextField(
  2. onChanged: (value){
  3. print('onChanged:$value');
  4. },
  5. onEditingComplete: (){
  6. print('onEditingComplete');
  7. },
  8. onTap: (){
  9. print('onTap');
  10. },
  11. )

输入框右下角经常需要字数统计,除了使用上面介绍的方法外,还可以使用buildCounter,建议使用此方法,用法如下:

  1. TextField(
  2. maxLength: 100,
  3. buildCounter: (
  4. BuildContext context, {
  5. int currentLength,
  6. int maxLength,
  7. bool isFocused,
  8. }) {
  9. return Text(
  10. '$currentLength/$maxLength',
  11. );
  12. },
  13. )

动态获取焦点

  1. FocusScope.of(context).requestFocus(_focusNode);

_focusNode为TextField的focusNode:

  1. _focusNode = FocusNode();
  2. TextField(
  3. focusNode: _focusNode,
  4. ...
  5. )

动态失去焦点

  1. _focusNode.unfocus();

过渡颜色的文字

  1. Builder(
  2. builder: (BuildContext context) {
  3. RenderBox box = context.findRenderObject();
  4. final Shader linearGradient = LinearGradient(
  5. colors: <Color>[Colors.purple, Colors.blue],
  6. ).createShader(
  7. Rect.fromLTWH(0.0, 0.0, box?.size?.width, box?.size?.height));
  8. return Text(
  9. '老孟,专注分享Flutter技术和应用实战',
  10. style: new TextStyle(
  11. fontSize: 18.0,
  12. fontWeight: FontWeight.bold,
  13. foreground: Paint()..shader = linearGradient),
  14. );
  15. },
  16. )

Builder组件是为了计算当前Text组件大小,生成LinearGradient。

带前后置标签的文本

  1. RichText(
  2. text: TextSpan(
  3. style: DefaultTextStyle.of(context).style,
  4. children: <InlineSpan>[
  5. WidgetSpan(
  6. child: Container(
  7. margin: EdgeInsets.only(right: 10),
  8. padding: EdgeInsets.symmetric(horizontal: 10),
  9. decoration: BoxDecoration(
  10. shape: BoxShape.rectangle,
  11. borderRadius: BorderRadius.all(Radius.circular(20)),
  12. color: Colors.blue),
  13. child: Text(
  14. '判断题',
  15. style: TextStyle(color: Colors.white),
  16. ),
  17. )),
  18. TextSpan(text: '泡沫灭火器可用于带电灭火'),
  19. ]),
  20. )

“服务协议”

通常在登录页面的底部会出现登录即代表同意并阅读 《服务协议》,其中《服务协议》为蓝色且可点击:

  1. Text.rich(
  2. TextSpan(
  3. text: '登录即代表同意并阅读',
  4. style: TextStyle(fontSize: 11, color: Color(0xFF999999)),
  5. children: [
  6. TextSpan(
  7. text: '《服务协议》',
  8. style: TextStyle(color: Colors.blue, fontWeight: FontWeight.bold),
  9. recognizer: TapGestureRecognizer()
  10. ..onTap = () {
  11. print('onTap');
  12. },
  13. ),
  14. ]),
  15. )

登录密码输入框

  1. TextField(
  2. decoration: InputDecoration(
  3. fillColor: Color(0x30cccccc),
  4. filled: true,
  5. enabledBorder: OutlineInputBorder(
  6. borderSide: BorderSide(color: Color(0x00FF0000)),
  7. borderRadius: BorderRadius.all(Radius.circular(100))),
  8. hintText: '输入密码',
  9. focusedBorder: OutlineInputBorder(
  10. borderSide: BorderSide(color: Color(0x00000000)),
  11. borderRadius: BorderRadius.all(Radius.circular(100))),
  12. ),
  13. textAlign: TextAlign.center,
  14. obscureText: true,
  15. onChanged: (value) {
  16. },
  17. )

评论回复

  1. Text.rich(
  2. TextSpan(
  3. text: '回复',
  4. style: TextStyle(fontSize: 11, color: Color(0xFF999999)),
  5. children: [
  6. TextSpan(
  7. text: '@老孟:',
  8. style: TextStyle(color: Colors.blue, fontWeight: FontWeight.bold),
  9. recognizer: TapGestureRecognizer()
  10. ..onTap = () {
  11. print('onTap');
  12. },
  13. ),
  14. TextSpan(
  15. text: '你好,想知道Flutter发展前景如何?',
  16. ),
  17. ]),
  18. )

交流

老孟Flutter博客地址(330个控件用法):http://laomengit.com

欢迎加入Flutter交流群(微信:laomengit)、关注公众号【老孟Flutter】:

Flutter实战】文本组件及五大案例的更多相关文章

  1. 【Flutter 实战】简约而不简单的计算器

    老孟导读:这是 [Flutter 实战]组件系列文章的最后一篇,其他组件地址:http://laomengit.com/guide/widgets/Text.html,接下来将会讲解动画系列,关注老孟 ...

  2. 【Flutter实战】图片组件及四大案例

    老孟导读:大家好,这是[Flutter实战]系列文章的第三篇,这一篇讲解图片组件,Image有很多高级用法,希望对您有所帮助. 图片组件是Flutter基础组件之一,和文本组件一样必不可少.图片组件包 ...

  3. 【Flutter实战】定位装饰权重组件及柱状图案例

    老孟导读:Flutter中有这么一类组件,用于定位.装饰.控制子组件,比如 Container (定位.装饰).Expanded (扩展).SizedBox (固定尺寸).AspectRatio (宽 ...

  4. 【Flutter实战】六大布局组件及半圆菜单案例

    老孟导读:Flutter中布局组件有水平 / 垂直布局组件( Row 和 Column ).叠加布局组件( Stack 和 IndexedStack ).流式布局组件( Wrap )和 自定义布局组件 ...

  5. 【Flutter 实战】1.20版本更新及新增组件

    老孟导读:Flutter 1.20 更新了 Slider.RangeSlider.日期选择器组件.时间选择器组件的样式,新增了交换组件:InteractiveViewer,下面详细介绍其用法. 滑块 ...

  6. Flutter学习笔记(11)--文本组件、图标及按钮组件

    如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 文本组件 文本组件(text)负责显示文本和定义显示样式,下表为text常见属性 Text组件属性及描述 属性名 类型 默认 ...

  7. 【Flutter学习】基本组件之文本组件Text

    一,概述 文本组件(Text)负责显示文本和定义显示样式, 二,继承关系 Object > Diagnosticable > DiagnosticableTree > Widget ...

  8. Java Swing实战(三)文本组件JTextField和密码组件JPasswordField

    接下来添加文本组件JTextField和密码组件JPasswordField. /** * @author: lishuai * @date: 2018/11/26 13:51 */ public c ...

  9. 【Flutter 实战】各种各样形状的组件

    老孟导读:Flutter中很多组件都有一个叫做shape的属性,类型是ShapeBorder,比如Button类.Card等组件,shape表示控件的形状,系统已经为我们提供了很多形状,对于没有此属性 ...

随机推荐

  1. Python一切皆是对象,但这和内存管理有什么关系?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python的第15篇文章,我们来聊聊Python中内存管理机制,以及循环引用的问题. Python的内存管理机制 对于工程师而言,内 ...

  2. HDU6097 Mindis

    题目链接:https://cn.vjudge.net/problem/HDU-6097 知识点: 计算几何.圆的反演 题目大意: 已知一个圆心在原点的圆的半径,再给定 \(P, Q\) 两点坐标( \ ...

  3. CF916C

    题目链接:http://codeforces.com/contest/916/problem/C 题目大意: 用\(n\)个结点,\(m\)条边(每条边的权值范围为[1, 109]) 构造出一个无向带 ...

  4. Java——动态生成POJO类

    package com.java.test.dynamicpojo; import java.io.ByteArrayOutputStream; import java.io.IOException; ...

  5. js时间格式转换,传入时间戳,第二哥参数是格式,也可不传

    export function parseTime(time, pattern) { if (arguments.length === 0 || !time) { return null } cons ...

  6. 自定义reaml创建使用实现认证

    注意清空shiro.ini 创建User对象 package cn.zys.Bean; public class User { private Integer id; private String u ...

  7. mvc的视图渲染方式

    ModelAndView ModelAndView vm = new ModelAndView(); //封装要显示在试图上的数据 vm.addObject("msg"," ...

  8. 深入理解JS:执行上下文中的this(一)

    目录 执行上下文与执行上下文栈 this 全局环境 函数环境 总结 参考 1.执行上下文与执行上下文栈 (1)什么是执行上下文? 在 JavaScript 代码运行时,解释执行全局代码.调用函数或使用 ...

  9. Cypress系列(2)- Cypress 框架的详细介绍

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html Cypress 简介 基于 JavaSc ...

  10. Java工作流引擎的测试容器-功能-使用方法-注意事项

    工作流引擎的测试容器-功能-使用方法-注意事项 关键字 Ccbpm, ccflow,jflow,工作流引擎,工作流引擎测试容器,表单引擎 功能说明 工作流的测试容器是为了解决手工模拟人工登录模式下测试 ...