简介

我们在flutter中使用能够包含多个child的widget的时候,经常会遇到超出边界范围的情况,尤其是在Column和Row的情况下,那么我们有没有什么好的解决办法呢?答案就是今天我们要讲解的Wrap。

Row和Column的困境

Row和Column中可以包含多个子widget,如果子widget超出了Row或者Column的范围会出现什么情况呢?

我们以Row的情况举个例子:

  1. Widget build(BuildContext context) {
  2. return Row(
  3. textDirection: TextDirection.ltr,
  4. mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  5. children: [
  6. YellowBox(),
  7. YellowBox(),
  8. Expanded(
  9. child: YellowBox(),
  10. ),
  11. YellowBox(),
  12. ],
  13. );
  14. }

上面的例子中,我们在Row中添加了几个YellowBox,YellowBox是一个width=100,height=50的长方形:

  1. Widget build(BuildContext context) {
  2. return Container(
  3. width: 100,
  4. height: 50,
  5. decoration: BoxDecoration(
  6. color: Colors.yellow,
  7. border: Border.all(),
  8. ),
  9. );
  10. }

运行上面的代码,我们可以得到这样的界面:

如果在Row中多添加几个YellowBox会有什么效果呢?

我们在上面的Row中多添加一个yellowBox:

  1. Widget build(BuildContext context) {
  2. return Row(
  3. textDirection: TextDirection.ltr,
  4. mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  5. children: [
  6. YellowBox(),
  7. YellowBox(),
  8. Expanded(
  9. child: YellowBox(),
  10. ),
  11. YellowBox(),
  12. YellowBox(),
  13. ],
  14. );
  15. }

运行可以得到下面的界面:

可以看到,因为Row中的子widget太多了,已经超出了Row的范围,界面上已经报错了。

要解决这个问题,就需要使用到Wrap组件。

Wrap组件详解

先来看下Wrap的定义:

  1. class Wrap extends MultiChildRenderObjectWidget

Wrap继承自MultiChildRenderObjectWidget,表示可以包含多个子child。

接下来是Wrap的构造函数:

  1. Wrap({
  2. Key? key,
  3. this.direction = Axis.horizontal,
  4. this.alignment = WrapAlignment.start,
  5. this.spacing = 0.0,
  6. this.runAlignment = WrapAlignment.start,
  7. this.runSpacing = 0.0,
  8. this.crossAxisAlignment = WrapCrossAlignment.start,
  9. this.textDirection,
  10. this.verticalDirection = VerticalDirection.down,
  11. this.clipBehavior = Clip.none,
  12. List<Widget> children = const <Widget>[],
  13. }) : assert(clipBehavior != null), super(key: key, children: children);

构造函数中列出了Wrap中常用的属性。

其中direction表示子组件的排列方向。alignment表示的是子组件的对其方式。spacing表示子组件的间隔。

跟spacing类似的还有一个runSpacing属性,两者有什么区别呢? 我们还是通过一个具体的例子来查看。

  1. Widget build(BuildContext context) {
  2. return Wrap(
  3. direction: Axis.horizontal,
  4. textDirection: TextDirection.ltr,
  5. children: [
  6. YellowBox(),
  7. YellowBox(),
  8. // Expanded(
  9. // child: YellowBox(),
  10. // ),
  11. YellowBox(),
  12. YellowBox(),
  13. YellowBox(),
  14. ],
  15. );

还是上面的例子,这里我们使用Wrap来替换Row,这里我们使用了direction选项,表示是在横向方向进行Wrap。

然后在children中添加了5个YellowBox。

注意,这里不能使用Expanded,否则会报错,所以我们把Expanded注释掉了,运行可以得到下面的界面:

可以看到YellowBox是按行的方向来排列的,超出一行的范围之后就会自动换行,这也就是Wrap的功能。

我们在讲解Wrap的时候,还提到了两个属性,分别是spacing和runSpacing。两者有什么区别呢?

先看下spacing:

  1. Widget build(BuildContext context) {
  2. return Wrap(
  3. direction: Axis.horizontal,
  4. spacing: 10,
  5. textDirection: TextDirection.ltr,
  6. children: [
  7. YellowBox(),
  8. YellowBox(),
  9. // Expanded(
  10. // child: YellowBox(),
  11. // ),
  12. YellowBox(),
  13. YellowBox(),
  14. YellowBox(),
  15. ],
  16. );
  17. }

我们先给Wrap添加spacing属性,运行可以得到下面的界面:

可以看到YellowBox之间是用spacing来进行分割的。

那么如果我们希望在Wrap换行的时候,两行之间也有一些间距应该怎么处理呢?

这个时候就需要用到runSpacing属性了:

  1. Widget build(BuildContext context) {
  2. return Wrap(
  3. direction: Axis.horizontal,
  4. spacing: 10,
  5. runSpacing: 10,
  6. textDirection: TextDirection.ltr,
  7. children: [
  8. YellowBox(),
  9. YellowBox(),
  10. // Expanded(
  11. // child: YellowBox(),
  12. // ),
  13. YellowBox(),
  14. YellowBox(),
  15. YellowBox(),
  16. ],
  17. );
  18. }

运行可以得到下面的界面:

Wrap已经完美的运行了。

总结

Wrap可以通过使用不同的direction来替换Row或者Column,我们在组件可能会超出范围的时候,就可以考虑使用Wrap了。

本文的例子:https://github.com/ddean2009/learn-flutter.git

更多内容请参考 www.flydean.com

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

flutter系列之:永远不用担心组件溢出的Wrap的更多相关文章

  1. JS组件系列——又一款MVVM组件:Vue(二:构建自己的Vue组件)

    前言:转眼距离上篇 JS组件系列——又一款MVVM组件:Vue(一:30分钟搞定前端增删改查) 已有好几个月了,今天打算将它捡起来,发现好久不用,Vue相关技术点都生疏不少.经过这几个月的时间,Vue ...

  2. 完全免费,再也不用担心转pdf文件乱来乱去的问题了

    完全免费,再也不用担心转pdf文件乱来乱去的问题了. 源代码:https://github.com/xlgwr/WpsToPdf.git 第三方插件Bye Bye... 功能说明 主要引用Wps金山办 ...

  3. 教会舍友玩 Git (再也不用担心他的学习)

    舍友长大想当程序员,我和他爷爷奶奶都可高兴了,写他最喜欢的喜之郎牌Git文章,学完以后,再也不用担心舍友的学习了(狗头)哪里不会写哪里 ~~~ 一 先来聊一聊 太多东西属于,总在用,但是一直都没整理的 ...

  4. 妈妈再也不用担心别人问我是否真正用过redis了

    1. Memcache与Redis的区别 1.1. 存储方式不同 1.2. 数据支持类型 1.3. 使用底层模型不同 2. Redis支持的数据类型 3. Redis的回收策略 4. Redis小命令 ...

  5. (转)再不用担心DataRow类型转换和空值了(使用扩展方法解决高频问题)

    再不用担心DataRow类型转换和空值了(使用扩展方法解决高频问题) XML文档操作集锦(C#篇) webapi文档描述-swagger

  6. 锋利的js之妈妈再也不用担心我找错钱了

    用js实现收银功能. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <hea ...

  7. 使用 crosswalk-cordova 打包sencha touch 项目,再也不用担心安卓兼容问题!

    国内的安卓手机品牌众多,安卓操作系统碎片化也很严重,我们使用sencha touch 开发的应用不可避免的出现了各种无解的兼容性问题. 有时候我就在想,有没有既能支持cordova,又能让我们把Chr ...

  8. 【阿里云产品公测】离线归档OAS,再也不用担心备份空间了

    [阿里云产品公测]离线归档OAS,再也不用担心备份空间了 作者:阿里云用户莫须有3i 1 起步  1.1 初识OAS  啥是OAS,请看官方说明: 引用: 开放归档服务(Open Archive Se ...

  9. 理解Linux文档的默认安全机制、隐藏属性、特殊权限,妈妈在也不用担心你从删库到跑路!!!

    写在前面 前面的章节 详解Linux文档属性.拥有者.群组.权限.差异,介绍了文档的基本权限,包括读写执行(r,w,x),还有文档若干的属性,包括是否为目录(d).文件(-).链接文件(l).拥有者. ...

随机推荐

  1. GCC常见命令

    rwx 对于目录和文件的区别 文件 目录 r 文件的内容可以被查看.支持cat.more.head...vim 目录的内容可以被查看.ls.tree w 文件的内容可以被添加.修改.删除.vim &g ...

  2. Java学习--基础

    java学习 基础 Java三大版本 javase 标准版 占领桌面端(基础) javame 移动版 嵌入式开发.占领手机端 javaee 企业版 占领服务器端 Java的特性和优势 跨平台.可移植性 ...

  3. Luogu2420 让我们异或吧 (熟练剖分)

    \(dis[u] \bigoplus dis[v] = dis[u] \bigoplus dis[v] \bigoplus dis[lca\{x,y\}] \bigoplus dis[lca\{x,y ...

  4. Windows 电脑杀毒简单有效的方式

    Windows 电脑杀毒通常会选择杀毒软件,这样太笨重,且容易占内存和存在流氓软件侵入. 推荐使用 Windows 自带的恶意软件删除工具 按住 Win + R 键,弹出运行窗口,输入 mrt. 系统 ...

  5. 048_末晨曦Vue技术_处理边界情况之使用$root访问根实例

    处理边界情况之使用$root访问根实例 点击打开视频教程 在每个 new Vue 实例的子组件中,其根实例可以通过 $root property 进行访问. 例如,在这个根实例中: src\main. ...

  6. KingbaseESV8R6垃圾回收受到参数old_snapshot_threshold的影响

    垃圾回收影响因素 影响垃圾回收的因素有很多,垃圾回收不及时,最直接导致表膨胀,详情查看文档<KingbaseESV8R6 垃圾回收原理以及如何预防膨胀>. vacuum回收垃圾的tuple ...

  7. KingbaseES V8R6单实例外部备份故障案例

    案例说明: 在KingbaseES V8R6单实例环境,配置外部备份服务器使用sys_backup.sh物理备份时,出现以下"WAL segment xxx was not archived ...

  8. K8S_总结

    K8S 核心组件 配置存储中心 --> etcd服务 主控(master)节点 ​ [1] kube-apiserver 服务 apiserver:(K8S 大脑) 1. 提供了集群管理的 RE ...

  9. Linux做bond4

    一.编辑bond网络配置 vim /etc/sysconfig/network-scripts/ifcfg-bond4 DEVICE=bond4 NAME=bond4 TYPE=Bond ONBOOT ...

  10. Taurus.MVC 微服务框架 入门开发教程:项目集成:6、微服务间的调用方式:Rpc.StartTaskAsync。

    系统目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...