Flutter SizedBox布局组件Widget使用示例详解

作者:IAM17 时间:2022-02-08 18:19:44 

Flutter Sizedbox 是一个 布局组件,用来给 child 添加 tight 约束的,也可以用来添加空白。

width,height是 Sizedbox 的参数

BoxConstraints get _additionalConstraints {
   return BoxConstraints.tightFor(width: width, height: height);
}
final BoxConstraints constraints = this.constraints;
if (child != null) {
 child!.layout(_additionalConstraints.enforce(constraints),
     parentUsesSize: true);
 size = child!.size;
} else {
 size = _additionalConstraints.enforce(constraints).constrain(Size.zero);
}

enforce 方法根据 _additionalConstraints 返回一个新约束,新约束保证在参数 constraints 的范围之内。

child 的 constrains

constrains 是 tight ,SizedBox 透传 constrains 给 child。

constrains 是 loose,width 为空,SizedBox 透传 minWidth,maxWith 给 child;height为空,SizedBox 透传 minHeight,maxHeight 给 child。

constrains 是 loose,width 不为空, 在 constrains 范围内 给 child 的 width tight 约束;height 不为空 在 constrains 范围内 给 child 的 height tight 约束。

确定自己的大小

如果有 child ,和 child 一样大。

没有child ,constrains 是 tight ,大小为约束最小值。

没有child ,constrains 是 loose,在约束范围内由 width,height 参数指定。

SizedBox 的命名构造函数们

SizedBox 虽然本身很简单,但它命名构造函数确实不少。我们平时用的时候大多忽略了这些命名构造函数,所以应该先混个脸熟,用这些命名构造函数还是有好处的,可以增加代码的可读性。

SizedBox.expand

使 SizedBox 获得最大 Size,也就是和父 widget 一样大。

const SizedBox.expand({ super.key, super.child })
   : width = double.infinity,
     height = double.infinity;

SizedBox.shrink

让 SizedBox 尽量小。

const SizedBox.shrink({ super.key, super.child })
   : width = 0.0,
     height = 0.0;

SizedBox.fromSize

通过 size 来构造 SizedBox。

SizedBox.fromSize({ super.key, super.child, Size? size })
   : width = size?.width,
     height = size?.height;

SizedBox.square

保证 SizedBox 是一个正方形。

const SizedBox.square({super.key, super.child, double? dimension})
   : width = dimension,
     height = dimension;

应用场景

为 child 提供 tight 约束。

当指定了 width,height 参数后,child 就获得了宽高的 tight 约束。保证 child 有固定大小。这对于固定布局非常有用。

为 children 之间提供空白。

可以用 padding 添加空白,但那样会增加一层嵌套,用 SizedBox 充当空白看起来更好一些。

占位

只是用来占位,比如 Spacer 中的 child 用的就是 SizedBox.shrink。

class Spacer extends StatelessWidget {
 const Spacer({super.key, this.flex = 1})
   : assert(flex != null),
     assert(flex > 0);
 final int flex;
 @override
 Widget build(BuildContext context) {
   return Expanded(
     flex: flex,
     child: const SizedBox.shrink(),
   );
 }
}

来源:https://juejin.cn/post/7167880704699662367

标签:Flutter,SizedBox,布局组件,Widget
0
投稿

猜你喜欢

  • Java实现登录和注册案例

    2022-02-27 04:57:46
  • Android 中CheckBox多项选择当前的position信息提交的示例代码

    2022-05-15 19:13:51
  • C#获取每个年,月,周的起始日期和结束日期的方法

    2023-11-11 20:53:45
  • java并发分段锁实践代码

    2021-10-08 04:55:45
  • java生成饼图svg及JFreeChart生成svg图表

    2023-10-25 19:27:00
  • 一篇文章带你搞定JAVA Maven

    2023-12-09 17:42:10
  • RSA密钥--JAVA和C#的区别及联系

    2022-09-18 12:16:44
  • Android Flutter使用本地数据库编写备忘录应用

    2023-09-15 17:24:09
  • 解决C#中Linq GroupBy 和OrderBy失效的方法

    2022-11-21 00:25:11
  • Springboot异常日志输出方式

    2022-04-14 05:38:27
  • Unity工具类之生成文本验证码

    2021-06-21 03:38:42
  • Java程序员新手老手常用的八大开发工具

    2021-12-04 03:39:04
  • java多线程Future和Callable类示例分享

    2021-09-02 09:49:37
  • Javaweb mybatis接口开发实现过程详解

    2022-03-11 22:02:21
  • MyBatisPlus代码生成器的使用示例

    2022-04-28 07:52:42
  • Java对世界不同时区timezone之间时间转换的处理方法

    2023-11-08 13:19:30
  • Android在JNI中使用ByteBuffer的方法

    2021-11-08 21:14:35
  • C#11新特性使用案例详解

    2023-11-26 03:19:15
  • C#操作XML文件实例汇总

    2023-03-26 03:55:08
  • C#创建windows系统用户的方法

    2022-07-16 20:30:12
  • asp之家 软件编程 m.aspxhome.com