48、Flutter之widgets LayoutBuilder组件

2023-11-18

LayoutBuilder


通过 LayoutBuilder,我们可以在布局过程中拿到父组件传递的约束信息,然后我们可以根据约束信息动态的构建不同的布局。

比如我们实现一个响应式的 Column 组件 ResponsiveColumn,它的功能是当当前可用的宽度小于 200 时,将子组件显示为一列,否则显示为两列。简单来实现一下:

class ResponsiveColumn extends StatelessWidget {
  const ResponsiveColumn({Key? key, required this.children}) : super(key: key);

  final List<Widget> children;

  @override
  Widget build(BuildContext context) {
    // 通过 LayoutBuilder 拿到父组件传递的约束,然后判断 maxWidth 是否小于200
    return LayoutBuilder(
      builder: (BuildContext context, BoxConstraints constraints) {
        if (constraints.maxWidth < 200) {
          // 最大宽度小于200,显示单列
          return Column(children: children, mainAxisSize: MainAxisSize.min);
        } else {
          // 大于200,显示双列
          var _children = <Widget>[];
          for (var i = 0; i < children.length; i += 2) {
            if (i + 1 < children.length) {
              _children.add(Row(
                children: [children[i], children[i + 1]],
                mainAxisSize: MainAxisSize.min,
              ));
            } else {
              _children.add(children[i]);
            }
          }
          return Column(children: _children, mainAxisSize: MainAxisSize.min);
        }
      },
    );
  }
}


class LayoutBuilderRoute extends StatelessWidget {
  const LayoutBuilderRoute({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    var _children = List.filled(6, Text("A"));
    // Column在本示例中在水平方向的最大宽度为屏幕的宽度
    return Column(
      children: [
        // 限制宽度为190,小于 200
        SizedBox(width: 190, child: ResponsiveColumn(children: _children)),
        ResponsiveColumn(children: _children),
        LayoutLogPrint(child:Text("xx")) // 下面介绍
      ],
    );
  }
}

可以发现 LayoutBuilder 的使用很简单,但是不要小看它,因为它非常实用且重要,它主要有两个使用场景:

  1. 可以使用 LayoutBuilder 来根据设备的尺寸来实现响应式布局。
  2. LayoutBuilder 可以帮我们高效排查问题。比如我们在遇到布局问题或者想调试组件树中某一个节点布局的约束时 LayoutBuilder 就很有用。

打印布局时的约束信息

为了便于排错,我们封装一个能打印父组件传递给子组件约束的组件:

class LayoutLogPrint <T>extends StatelessWidget {
  final Widget child;
  final T? tag;
  const LayoutLogPrint({Key? key, required this.child, this.tag}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return LayoutBuilder(builder: (_,constraints){
      // assert在编译release版本时会被去除
      assert(() {
        print('${tag ?? key ?? child}: $constraints');
        return true;
      }());
      return child;
    });
  }
}

这样,我们就可以使用 LayoutLogPrint 组件树中任意位置的约束信息,比如:

LayoutLogPrint(child:Text("xx"))

 控制台输出:

flutter: Text("xx"): BoxConstraints(0.0<=w<=428.0, 0.0<=h<=823.0)

可以看到 Text("xx") 的显示空间最大宽度为 428,最大高度为 823 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

48、Flutter之widgets LayoutBuilder组件 的相关文章

  • 如何在 Android 中像 Google 地图一样获得持续的位置更新?

    我正在构建一个朋友跟踪 Android 应用程序 当我的朋友激活应用程序并带着他的 GPS 和蜂窝数据离开时 我需要在我的设备上跟踪他 这就是这个概念 我已经实现了 LocationListener 类 现在我可以从 Gps 或网络获取最后
  • Android 2.3 中崩溃服务重启后不会调用 onStartCommand()

    我遇到了 Android 服务重启的问题 我正在针对 API 版本 7 进行构建 并在 Android 2 3 3 的设备上运行 问题是 当我的服务被系统杀死并稍后重新启动时 只有onCreate 我的服务被称为 代码在onStartCom
  • 从 Parse.com 获取 NSString 并将其粘贴到 UILabel 中

    我想从 Parse com 获取 NSString 并将其粘贴到我的 iOS 应用程序中的标签中 有谁知道该怎么做 我遇到了很大的问题 提前致谢 反问题是 你想要得到哪个 NSString 我认为这是您想要显示的 PFObject 的某些属
  • Android NSD 未发现所有服务

    我正在尝试使用 Android 本机服务发现来运行应用程序 但有时当我运行该应用程序时 它不会发现我的网络中的所有服务 我正在运行代码https github com joeluchoa nsd https github com joelu
  • Swift:如何在 UITableViewController(包含 UICollectionView)中使用“didSelectItemAtIndexPath”?

    我有一个UITableViewController 在 的里面TableViewCell 它是UICollectionView 我想传递来自CollectionViewCell to a DetailViewController当用户点击单
  • adb 可以检测的设备数量是否有上限

    我想知道 android adb 工具可以检测的设备数量是否有最大限制 我在谷歌上没有找到任何答案 我已经成功连接了 13 台设备 但我不知道它是否仍然适用于更多设备 Thanks 似乎没有 adb 限制 但有一个 USB 控制器限制 具体
  • Android:保存新图像后刷新图库

    因此 在我的应用程序中 我有时将一堆图像保存到临时文件夹中 我希望它们立即显示在图库中 重新启动后 他们会这样做 但否则他们不会 我尝试过使用 sendBroadcast 方法 sendBroadcast new Intent Intent
  • 如何消除使用 DrawerLayout 打开 Activity 时的延迟?

    我有一个带有 DrawerLayout 的活动 但每当它打开时 都会有一个延迟 就像屏幕变白然后绘制我的屏幕一样 这发生在转换完成后 所以看起来屏幕动画过渡有点跳跃 在将视图与 ButterKnife 绑定后 我尝试将其放在 OnCreat
  • 在 Android 中移动目录的最快方法?

    在 Android 中移动目录最快的方法是什么 在大多数情况下 但并非所有情况 源和目标位于同一 SD 卡文件系统上 目前 我的代码遍历整个目录结构 并将每个文件的内容复制到新位置的同名新文件中 然后它会验证文件大小是否匹配 然后删除源文件
  • 找不到 R.layout.activity_main

    我试图使用一些在线教程来解决多种布局 问题是只要只有一个 XML 文件 我的程序就可以正确构建和编译 当我添加多个 XML 文件时 我收到错误消息 指出该行的 activity main 无法解析或不是字段 setContentView R
  • self.navigationController?.popViewControllerAnimated 来自 UIAlertController

    我是 swift 的新手 但我想我已经掌握了它的窍门 但这对我的进步来说是相当困难的 我想做的是 当我们找不到与用户查询相关的数据时 向用户抛出一条错误消息 然后继续将他带回之前的 ViewController 然而 我在做这件事时遇到了真
  • 如何获取 Android 中其他应用程序的屏幕时间?

    我想达到在 Android 系统上运行的每个应用程序的屏幕时间 例如 Facebook 工作时间为 3 小时 但屏幕时间为 1 2 小时 我怎么才能得到它 android app usage 使用情况统计 public final clas
  • 在 Obj C 中使用 Brad Larson GPUImage 创建照片草图效果

    您好 我想尝试使用 Brad Larson 的照片上的素描效果GPUImage sdk in iOS 我正在尝试创建这样的草图效果 但我得到的素描效果是这样的 我正在使用 GPUImageSketchFilter 来创建此效果 以下是我为实
  • 导航抽屉突出显示所选项目不起作用

    我试图突出显示选定的导航抽屉项目 但它不起作用 它仅在按下项目时突出显示 但在选择项目后不会保持突出显示 我有以下代码 列表视图
  • 如何根据视图最大尺寸自动调整多行 TextView 上的文本大小?

    我一直在寻找一种在文本视图中自动调整文本的方法 通过我的搜索 我找到了很多解决方案 例如 字体适合文本视图 https stackoverflow com questions 2617266 how to adjust text font
  • 具有一个可见单元格的 UITableView:确定哪一个最可见

    给定一个在任何给定时间都有一个可见单元格的 UITableView 我如何确定哪个单元格是most滚动表视图时在视图中 我知道我可以通过这样做获得一系列可见单元格 NSArray paths tableView indexPathsForV
  • 使用 ProGuard 对 Android 代码进行混淆...如何知道它已被混淆?

    我有一个 Android 项目 最近通过 ProGuard 进行混淆运行后发布到市场 该项目导出时没有任何复杂性 但我怎么知道它已被混淆 我可以做些什么来验证混淆是否成功 寻找dump txt mapping txt seeds txt a
  • CCAvenue iOS 套件集成套件

    我正在尝试将 CCAvenue 支付集成集成到 iOS 中 他们给了我两个库文件 名为 libcrypto a and libssl a 他们还给了我一些头文件 为了实现这一点 他们提到我应该在构建设置中设置标头搜索路径和库搜索路径 我已经
  • 将下载进度条从 AsyncTask 更新到通知区域

    我已将异步任务实现到服务中 这是我正在调用的进度通知的初始化onPreExecute mProgressNotificationManager NotificationManager this getSystemService Contex
  • 使用 HttpClient 的 HTTP 请求太慢?

    我正在尝试编写一个 Android 应用程序 将一些发布值发送到托管在专用服务器上的 php 文件并存储数组结果 代码是这样的 HttpPost httppost DefaultHttpClient httpclient httppost

随机推荐

  • 【从零开始的Java开发】2-8-1 HTML入门:标签、表格、表单

    文章目录 HTML简介 常用标签 字体标签 段落标签p 注释标签 标题标签h 图片标签img 超级链接标签a 锚点标签 列表 阶段小结 表格 相关标签 合并行列 分组设置表格格式的标签 相关属性 其他标签 表单 表单主要控件和实例 表单其他
  • EasyDemo*SQLite数据库版本升级

    一 简介 我们在开发应用的时候 存储数据可能会用到数据库 第一个版本时所设计的数据库结构 如果在以后的app版本中需要增加业务逻辑 数据库的表可能要做相应的修改 那么原来的数据库结构就不能用了 这时就需要对数据库进行升级 二 升级方案 1
  • linux配置放火墙开放端口

    vi etc sysconfig iptables A INPUT m state state NEW m tcp p tcp dport 80 j ACCEPT 允许80端口通过防火墙 A INPUT m state state NEW
  • 神经网络实现连续型变量的回归预测(python)

    最近写论文时用到一个方法 是基于神经网络的最优组合预测 主要思想如下 在建立由回归模型 灰色预测模型 BP神经网络预测模型组成的组合预测模型库的基础上 利用以上三种单一预测模型的组合构成BP神经网络组合预测模型 我是参考的参考这篇文章 路玉
  • Linux3.10内核之后proc文件系统的使用

    最近在通过无线扫描周边的手机mac的事情 拿到AP周边的mac后需要送到应用层 之前接触的都是RTOS的系统 数据交互比较简单 Linux下应用层无法直接和驱动交换数据 需要通过kernel提供的一些通道 因为只是向应用层送数据 和应用层的
  • Windows7旗舰版和10 创建原始套接字失败,代码10013

    笔记本重装系统后 以前能运行的程序中的Ping程序不能运行了 查看代码 创建套接字失败 RawSock socket AF INET SOCK RAW IPPROTO ICMP RawSock INVALID SOCKET 用DWORD d
  • 微信小程序地图(map)组件点击(tap)获取经纬度

    微信小程序中使用地图 map 组件 通过点击 tap 获取经纬度 按照官方的回应 暂时是没法做到的 从地图组件API多有残缺判断 怀疑是个实习生干的 做个变通 适用性有限 请大家参考 基本思路就是在地图上铺满一层marker 从而通过点击m
  • 智慧合约:智能合约安全问题的AI解决方案

    一支穿云箭 千军万马来相见 在经历三个月 漫长熊市 后 从4月中旬开始 EOS的一个拉升 形成了数字货币市场大牛市的壮观景象 可是在美链BeautyChain BEC 的智能合约漏洞被黑客利用 随意刷币 SmartMesh SMT 智能合约
  • System.out.println()影响系统运行效率!!!

    在Java开发中 System out println 是一种常用的输出方式 可以将字符串输出到控制台 然而 这种输出方式在一定程度上会影响系统的运行效率 首先 System out println 的输出操作需要占用CPU和内存资源 因为
  • 配置Maven仓库私服

    在项目的pom xml文件中配置 将下面代码复制粘贴到文件的最下方即可
  • 霍尔传感器测电机的转速

    霍尔传感器可以用于测量电机的转速 测量原理是通过检测电机旋转时产生的磁场变化来计算转速 具体的测量方法如下 1 在电机旋转的轴上安装一个磁铁 磁铁的北极和南极在轴上相隔一定距离 2 在电机旋转轴的一侧安装一个霍尔传感器 传感器的感应面与磁铁
  • java的intern方法

    intern 方法返回值 一个字符串 内容与此字符串相同 但一定取自具有唯一字符串的池 new的字符串和变量不会进入常量池 String str1 a String str2 b String str3 ab 放在常量池 String st
  • Android_CTF: kgb_messenger

    环境 kgb messenger apk 测试机 OnePlus Andorid 9 1 Alerts 安装该apk后 使用发现如下的界面 用 jadx 反编译该 apk 搜索字符串 Russian 在MainActivity中发现了以上字
  • Git安装与配置及常见命令

    Git安装与配置及常见命令 1 下载与安装 1 官方下载地址 https git scm com download win 2 安装好之后 直接点击 运行即可 之后一直默认就行 3 桌面点击右键 会出现 Git Bash Here 点击此选
  • SpringBoot自定义bean的加载顺序

    最近面试的时候被问到这个问题 当时自己没回答上来 下来自己想了想然后又查了些博客 所以就记录下这个 首先写出两个测试类 Component public class TestA public TestA System out println
  • 基于深度学习的语义分割之FCN、SegNet、UNet、LinkNet、PSPNet、DeepLab系列

    图像分割 Image Segmentation 是计算机视觉研究中的一个经典难题 也是图像理解领域关注的一个热点 在场景理解 医学图像分析 机器人感知 视频监控 增强现实 图像压缩等领域有着广泛的应用 图像分割 简单来说就是在图像中把目标从
  • linux下wifi编程(基于netlink和nl80211.h)

    http blog csdn net vichie2008 article details 37520325
  • Mac系统(Linux系统) 当不知道MySql的root密码时候, 重置root密码

    1 首先打开终端 进入MySQL的安装目录下的bin文件夹 如 usr local mysql bin 2 执行以下命令以无密码方式登录MySQL mysql u root 3 进入MySQL后 选择mysql数据库 use mysql 4
  • QT信号与槽的自动连接

    信号与槽的自动连接 信号与槽可以通过使用手写代码显式的实现关联 也可以运用 QMetaObject 类规定的槽 函数命名范式来实现自动关联 显式关联 首先我们来看一下 不使用 自动关联规则 的情形 在下面这段代码里面 我们定义了一个对话框类
  • 48、Flutter之widgets LayoutBuilder组件

    LayoutBuilder 通过 LayoutBuilder 我们可以在布局过程中拿到父组件传递的约束信息 然后我们可以根据约束信息动态的构建不同的布局 比如我们实现一个响应式的 Column 组件 ResponsiveColumn 它的功