首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Flutter的文本、图片和按钮使用

Flutter的文本、图片和按钮使用

作者头像
JavaEdge
发布于 2023-07-09 08:03:39
发布于 2023-07-09 08:03:39
1.6K00
代码可运行
举报
文章被收录于专栏:JavaEdgeJavaEdge
运行总次数:0
代码可运行

像视图数据流转机制、底层渲染方案、视图更新策略等知识,都是构成一个UI框架的根本,看似枯燥,却往往具有最长久的生命力。

因此, 只有把这些最基础的知识弄明白,修好内功,才能触类旁通,由点及面形成自己知识体系,也能在框架之上思考应用层构建视图实现的合理性。

对视图基础有整体印象后,再学习Flutter视图系统所提供的UI控件。作为UI框架,与AndroidiOS和React类似,Flutter也提供很多UI控件。而文本、图片和按钮则是这些不同UI框架中构建视图都要用到的最基本控件。

1 文本控件

文本是视图系统中的常见控件,用来显示一段特定样式的字符串,就比如Android里的TextView、iOS中的UILabel。而在Flutter中,文本展示是通过Text控件实现的。

Text支持两种类型文本展示:

  • 默认的展示单一样式的文本Text
  • 支持多种混合样式的富文本Text.rich

1.1 使用单一样式的文本Text

单一样式文本Text的初始化,要传入需展示的字符串。而这字符串的具体展示效果,受构造函数其他参数控制。这些参数分为:

  • 控制整体文本布局的参数,如文本对齐方式textAlign、文本排版方向textDirection,文本显示最大行数maxLines、文本截断规则overflow等都是构造函数中的参数
  • 控制文本展示样式的参数,如字体名称fontFamily、字体大小fontSize、文本颜色color、文本阴影shadows等等,这些参数被统一封装到了构造函数中的参数style
展示单一样式的文本Text

居中布局、20号红色粗体展示样式的字符串:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Text(
  '文本是视图系统中的常见控件,用来显示一段特定样式的字符串,就比如Android里的TextView,或是iOS中的UILabel。',
  textAlign: TextAlign.center,//居中显示
  style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20, color: Colors.red),//20号红色粗体展示
);

运行效果如下图所示:

在一段字符串中支持多种混合展示样式

与单一样式的关键区别在于分片,即如何把一段字符串分为几个片段,给每个片段单独设置样式:

  • Android中使用SpannableString实现
  • iOS中使用NSAttributedString来实现
  • Flutter也有类似概念TextSpan

TextSpan定义一个字符串片段该如何控制其展示样式,而将这些有独立展示样式的字符串组装在一起,则能支持混合样式的富文本展示。

分别定义黑色、红色两种展示样式,随后把一段字符串分成4个片段,并设置不同展示样式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TextStyle blackStyle = TextStyle(fontWeight: FontWeight.normal, fontSize: 20, color: Colors.black); //黑色样式

TextStyle redStyle = TextStyle(fontWeight: FontWeight.bold, fontSize: 20, color: Colors.red); //红色样式

Text.rich(
    TextSpan(
        children: <TextSpan>[
          TextSpan(text:'文本是视图系统中常见的控件,它用来显示一段特定样式的字符串,类似', style: redStyle), //第1个片段,红色样式
          TextSpan(text:'Android', style: blackStyle), //第1个片段,黑色样式
          TextSpan(text:'中的', style:redStyle), //第1个片段,红色样式
          TextSpan(text:'TextView', style: blackStyle) //第1个片段,黑色样式
        ]),
  textAlign: TextAlign.center,
);

运行效果,如下图所示:

再看Flutter中的图片控件Image。

2 图片

使用Image可让我们向用户展示一张图片。图片显示方式很多,如资源图片、网络图片、文件图片等,图片格式各不相同,在Flutter也有多种方式加载不同形式、支持不同格式图片:

  • 加载本地资源图片,如Image.asset(‘images/logo.png’)
  • 加载本地(File文件)图片,如Image.file(new File(’/storage/xxx/xxx/test.jpg’))
  • 加载网络图片,如Image.network( 'http://xxx/xxx/test.gif')

除了根据图片显示方式设置不同图片源,图片构造方法还提供:

  • 填充模式fit
  • 拉伸模式centerSlice
  • 重复模式repeat等属性

可针对图片与目标区域的宽高比差异制定排版模式。

这和Android中ImageView、iOS里的UIImageView的属性都类似。可参考官方文档中的 Image的构造函数 部分,去查看Image控件具体使用方法。

FadeInImage控件

加载网络图片,为提升用户等待体验,会加占位图、加载动画等元素,但默认Image.network构造方法不支持这些高级功能,FadeInImage控件就有用了。

FadeInImage控件提供图片占位功能,并支持在图片加载完成时淡入淡出视觉效果。由于Image支持gif格式,还可将一些炫酷加载动画作占位图。

加载大图片时,将一张loading的gif作为占位图展示给用户:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FadeInImage.assetNetwork(
  placeholder: 'assets/loading.gif', //gif占位
  image: 'https://xxx/xxx/xxx.jpg',
  fit: BoxFit.cover, //图片拉伸模式
  width: 200,
  height: 200,
)

Image控件需根据图片资源异步加载情况,决定显示效果,因此是StatefulWidget。图片加载过程由ImageProvider触发,而ImageProvider表示异步获取图片数据的操作,可从资源、文件和网络等不同渠道获取图片。

  • ImageProvider根据_ImageState中传递的图片配置生成对应的图片缓存key
  • 然后去ImageCache查找是否有对应图片缓存:
    • 有,通知_ImageState刷新UI
    • 没有,启动ImageStream开始异步加载,加载完毕后,更新缓存
  • 最后,通知_ImageState刷新UI

图片展示流程:

ImageCache使用LRU缓存更新策略,默认最多存储1000张图片,最大缓存限制100MB,当限定空间存满数据,把最久没有被访问到的图片清除。图片 缓存只会在运行期间生效,也就是只缓存在内存中。要支持缓存到文件系统,可使用 CachedNetworkImage 控件。

CachedNetworkImage使用类似Image,除了支持图片缓存,还提供比FadeInImage更强大的加载过程占位与加载错误占位,支持比用图片占位更灵活的自定义控件占位。

加载图片时,不仅给用户展示占位的转圈loading,还提供错误图兜底,以备图片加载出错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CachedNetworkImage(
        imageUrl: "http://xxx/xxx/jpg",
        placeholder: (context, url) => CircularProgressIndicator(),
        errorWidget: (context, url, error) => Icon(Icons.error),
     )

3 按钮

可响应用户交互事件。Flutter提供三个基本按钮控件:

  • FloatingActionButton:圆形按钮,一般在屏幕内容前面,处理界面中最常用、最基础用户动作。计数器示例的“+”悬浮按钮就是FloatingActionButton
  • RaisedButton:凸起按钮,默认带灰色背景,被点击后灰色背景会加深
  • FlatButton:扁平化按钮,默认透明背景,被点击后会呈现灰色背景

按钮控件使用方法唯一区别只是默认样式不同。

分别定义FloatingActionButton、FlatButton与RaisedButton,功能完全一样,点击时打印文字:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FloatingActionButton(onPressed: () => print('FloatingActionButton pressed'),child: Text('Btn'),);
FlatButton(onPressed: () => print('FlatButton pressed'),child: Text('Btn'),);
RaisedButton(onPressed: () => print('RaisedButton pressed'),child: Text('Btn'),);

按钮控件:

既然是按钮,因此除了控制基本样式,还要响应用户点击行为。这就对应按钮控件中的两个最重要参数:

  • onPressed参数用于设置点击回调,告诉Flutter在按钮被点击时通知我们。若onPressed参数为空,则按钮会处于禁用状态,不响应用户点击
  • child参数用于设置按钮内容,告诉Flutter控件应长成啥样,即控制按钮控件的基本样式。child可接收任意Widget,如上面例子中传入的Text,此外还可传入Image等控件

虽可通过child参数控制按钮控件基本样式,但系统默认样式太单调,通常进行控件样式定制。与Text控件类似,按钮控件也提供丰富样式定制功能,如背景颜色color、按钮形状shape、主题颜色colorBrightness等。

以FlatButton为例介绍按钮样式定制:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FlatButton(
    color: Colors.yellow, //设置背景色为黄色
    shape:BeveledRectangleBorder(borderRadius: BorderRadius.circular(20.0)), //设置斜角矩形边框
    colorBrightness: Brightness.light, //确保文字按钮为深色
    onPressed: () => print('FlatButton pressed'),
    child: Row(children: <Widget>[Icon(Icons.add), Text("Add")],)
)

将一个加号Icon与文本组合,定义按钮基本外观;随后通过shape指定其外形为斜角矩形边框,并将按钮背景色设为黄色。

因为按钮背景颜色是浅色的,为避免按钮文字看不清楚,我们通过设置按钮主题colorBrightness为Brightness.light,保证按钮文字颜色为深色。展示效果:

4 总结

UI控件是构建一个视图的基本元素,而文本、图片和按钮则是其中最经典的控件。

首先,认识支持单一样式和混合样式两种类型文本展示控件Text:

  • 通过TextStyle控制字符串的展示样式,其他参数控制文本布局,实现单一样式文本展示
  • 通过TextSpan将字符串分割为若干片段,对每个片段单独设置样式后组装,实现支持混合样式富文本展示

支持多种图片源加载方式的图片控件Image。Image内部通过ImageProvider根据缓存状态,触发异步加载流程,通知_ImageState刷新UI。不过,由于图片缓存是内存缓存,因此只在运行期间生效。要支持缓存到文件系统,使用CachedNetworkImage。

最后学习按钮控件。Flutter提供多种按钮控件,使用方法类似。控件初始化的child参数用于设置按钮长什么样,而onPressed参数则用于设置点击回调。与Text类似,按钮内部也有丰富UI定制接口。

UI基本信息表达,Flutter经典控件与原生Android、iOS系统提供的控件无本质区别。但自定义控件样式,Flutter的这些经典控件提供强大简洁扩展能力,快速开发功能复杂、样式丰富页面。

5 FAQ

阅读Flutter SDK中Text、Image、FadeInImage,以及按钮控件FloatingActionButton、FlatButton与RaisedButton的源码,在build函数中找出在内部真正承载其视觉功能的控件。发现什么现象?

在阅读Flutter SDK中Text、Image、FadeInImage、FloatingActionButton、FlatButton和RaisedButton的源码时,可以发现它们的build函数中都有一个内部真正承载其视觉功能的控件。

  • 对于Text控件,其内部真正承载其视觉功能的控件为RichText。
  • 对于Image控件,其内部真正承载其视觉功能的控件为RawImage。
  • 对于FadeInImage控件,其内部真正承载其视觉功能的控件为AnimatedOpacity和RawImage。
  • 对于FloatingActionButton控件,其内部真正承载其视觉功能的控件为Material和InkResponse。
  • 对于FlatButton控件,其内部真正承载其视觉功能的控件为Material和InkWell。
  • 对于RaisedButton控件,其内部真正承载其视觉功能的控件为Material和InkResponse。

这些控件都是Flutter框架中提供的基础控件,用于实现各种不同的视觉效果。在这些控件的build函数中,会根据不同的属性值来创建这些基础控件,并将它们组合在一起,从而实现所需的视觉效果。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Flutter跨平台移动端开发丨Text、Button、Image、Switch、Checkbox、TextField
Material 库中的按钮点击时默认带有“水波动画”,点击事件监听通过 onPressed 属性设置,若不设置 onPressed 则按钮处于禁用状态,无点击动效也不响应点击事件
码脑
2019/05/25
2.7K0
《Flutter》-- 4.Flutter组件基础
Flutter开发中有一个非常重要的理念,即一切皆为组件。Flutter中Widget不仅可以表示UI元素,也可以布局元素、动画、装饰效果。
爱学习的程序媛
2022/04/07
13.4K0
《Flutter》-- 4.Flutter组件基础
『Flutter』常用组件 按钮、图片
经过『Flutter』布局组件 Container、Row、Column、Stack上一篇文章的学习,我们大家可以了解到布局相关的组件,但是在实际开发中,我们还需要使用到其他的组件,比如按钮、图片、文本、输入框等等,这些组件都是我们在开发中经常使用的,所以本篇文章我们就来学习一下这些常用组件。
程序员NEO
2025/03/07
6180
『Flutter』常用组件 按钮、图片
文本、图片和按钮在Flutter中怎么用
与iOS、Android和React类似,作为一个UI框架,Flutter自然也提供了很多UI控件。而文本、图片和按钮,则是这些不同的UI框架中构建视图都要用到的三个最基本的控件。
拉维
2019/08/12
9.2K0
文本、图片和按钮在Flutter中怎么用
Flutter Button(按钮控件)
本文介绍Flutter中常用按钮控件,包括:MaterialButton 、RaisedButton 、FlatButton 、IconButton 、FloatingActionButton 、OutlineButton 、ButtonBar 、lButton.icon()。
毛大姑娘
2020/09/10
8.3K0
Flutter Button(按钮控件)
Flutter | 常用组件
​ textAlign:文本的对齐方式;可以选择左对齐、右对齐还是居中。注意,对齐的参考系是Text widget本身
345
2022/02/11
12.1K0
Flutter | 常用组件
你知道吗,Flutter内置了10多种Button控件
Flutter内置了10多种Button(按钮)类控件供我们使用,了解这些控件有助于提高我们的开发速度。
老孟Flutter
2020/09/11
3.5K0
【Flutter】Image 组件 ( cached_network_image 网络图片缓存插件 )
从网络上加载的图片 , 可以缓存下来 , 如果再次获取该图片就直接从缓存中获取该图片 , 类似 Glide 中的三级缓存机制 ;
韩曙亮
2023/03/29
2K0
【Flutter】Image 组件 ( cached_network_image 网络图片缓存插件 )
Flutter第4天--基础控件(下)+Flex布局详解
Flutter七日游第四天:2018-12-19 天气:晴朗 零、前言 最近有些人问我怎么学的,操作这么6,有没有什么技巧。 今天一开始借助Image来给大家说一个分析的小技巧,让你不到30行代码
张风捷特烈
2018/12/27
2.3K0
flutter主题设置
Theme组件可以为material APP定义主题数据(ThemeData)。Material组件库里很多组件都使用了主题数据, 如导航栏颜色、标题字体、Icon样式等。Theme内会使用InheritedWidget来为其子树共享样式数据。
用户1974410
2022/09/20
5K0
flutter主题设置
【Flutter 专题】29 易忽略的【小而巧】的技术点汇总 (五)
和尚在做 Android 时经常会双击快速点击返回键弹出退出对话框,之后在进行操作,而 Flutter 也提供了监听返回导航的 WillPopScope,其中的回调方法返回一个 boolean 类型,true 时退出页面,false 时不退出,和尚设置在 1500ms 之内连续点击两次弹出提示框。在对时间进行监听时,和尚用到 Duration 可以设置时分秒毫秒微秒等,方便快捷。
阿策小和尚
2019/08/12
6620
【Flutter 专题】29 易忽略的【小而巧】的技术点汇总 (五)
Flutte部件目录-基本部件(二) 顶
支持以下图像格式:JPEG,PNG,GIF,GIF动画,WebP,WebP动画,BMP和WBMP
南郭先生
2018/08/14
4.9K0
Flutte部件目录-基本部件(二)
                                                    顶
Flutter 的按钮,看这篇文章就够了
我在之前的文章文本、图片和按钮在Flutter中怎么用中,简单介绍过按钮组件,本篇文章来详细聊聊Flutter中的各种按钮组件的各种应用场景。
拉维
2019/08/28
10.4K0
Flutter 的按钮,看这篇文章就够了
Flutter | 常用组件分类、概述、实战
AppBar(title属性,Text组件; action:动作响应;!!!! titleSpacing:标题文字间距; toolbarOpacity:标题透明度;)
凌川江雪
2020/06/16
4.6K0
Flutter组件学习(二)—— Image
上一节中,我们讲了 Flutter 中 Text 组件的一些用法以及 API,本节我们继续学习 Flutter 中的 Image 组件,同样先上图:
用户2802329
2018/12/21
1.6K0
『Flutter』常用组件 按钮、图片
经过上一篇文章的学习,我们大家可以了解到布局相关的组件,但是在实际开发中,我们还需要使用到其他的组件,比如按钮、图片、文本、输入框等等,这些组件都是我们在开发中经常使用的,所以本篇文章我们就来学习一下这些常用组件。
杨不易呀
2024/01/16
1K2
『Flutter』常用组件 按钮、图片
Flutter 入门指北之弹窗和提示(干货)
例如我们需要实现一个功能,修改某个值,修改后给用户一个提示,同时给用户一个撤销该操作的按钮,那么就可以通过 SnackBar 来简单实现。还有就是 SnackBar 可以和 floatingActionButton 完美的配合,弹出的时候不会遮挡住 fab
陈宇明
2020/12/16
2.6K0
Flutter入门指南
笔者项目中使用Flutter的模块并不多。虽然笔者还没有机会在项目中正式使用Flutter,但是也在学习Flutter的一些基本用法。本文就是一篇Flutter的入门介绍,后续会写更多深入介绍的文章。Flutter可以通过一套代码库快速构建高质量、高性能的跨平台应用,支持iOS、Android、Web以及桌面平台。在本文中,我们将介绍如何入门Flutter,包括环境搭建、基本概念、常用组件以及示例代码。
陆业聪
2024/07/23
5200
Flutter入门指南
Flutter技术与实战(4)
* 以 Text 的部分源码为例,说明 StatelessWidget 的构建过程。
八归少年
2022/06/29
11.5K0
Flutter技术与实战(4)
Flutter组件随笔练习
Container组件 import 'package:flutter/material.dart'; //快捷方式:fim void main() { runApp(MyApp()); } //自定义组件 class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return MaterialApp(
明知山
2020/09/02
1K0
推荐阅读
相关推荐
Flutter跨平台移动端开发丨Text、Button、Image、Switch、Checkbox、TextField
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档