Flutter之ConstrainedBox、SizedBox、UnconstrainedBox(尺寸限制类容器)

Stella981
• 阅读 671

1 ConstrainedBox、SizedBox、UnconstrainedBox介绍

1)、ConstrainedBox用于对子组件添加额外的约束。例如,如果你想让子组件的最小高度是80像素

  ConstrainedBox({
    Key key,
    @required this.constraints,
    Widget child,
  })

我们可以看到这里有个constraints

  final BoxConstraints constraints;

class BoxConstraints extends Constraints {
  /// Creates box constraints with the given constraints.
  const BoxConstraints({
    this.minWidth = 0.0,
    this.maxWidth = double.infinity,
    this.minHeight = 0.0,
    this.maxHeight = double.infinity,
  }) : assert (minWidth != null),
       assert (maxWidth != null),
       assert (minHeight != null),
       assert (maxHeight != null);

我们可以看到BoxConstraints继承Constraints,然后一些属性设置。

有多重ConstrainedBox限制时,对于minWidth和minHeight来说,是取父子中相应数值较大的

2)、SizedBox:用于给子元素指定固定的宽高

3)、UnconstrainedBox:不会对子组件产生任何限制,它允许其子组件按照其本身大小绘制

一般用来去掉父约束

2 测试代码

测试1、

  @override
  Widget build(BuildContext context) {
      return MaterialApp(
          title: 'open url',
          home: Scaffold(
            appBar: AppBar(
              // Here we take the value from the MyHomePage object that was created by
              // the App.build method, and use it to set our appbar title.
              title: Text('hello flutter'),
            ),
            body: Center(
              child: ConstrainedBox(
                  constraints: BoxConstraints(
                      minWidth: double.infinity,
                      minHeight: 100
                  ),
                child: Container(
                    width: 50,
                    height: 50,
                    color: Colors.green,
                ),
              ),
            ),
          ),
      );
  }
}

测试2、

  @override
  Widget build(BuildContext context) {
      return MaterialApp(
          title: 'open url',
          home: Scaffold(
            appBar: AppBar(
              title: Text('hello flutter'),
            ),
            body: Center(
              child: ConstrainedBox(
                  constraints: BoxConstraints(
                      minWidth: 200,
                      minHeight: 100
                  ),
                child: ConstrainedBox(
                  constraints: BoxConstraints(
                      minWidth: 100,
                      minHeight: 200
                  ),
                  child:  Container(
                    width: 50,
                    height: 50,
                    color: Colors.green,
                  ),
                ),
              ),
            ),
          ),
      );
  }
}

测试3、

  @override
  Widget build(BuildContext context) {
      return MaterialApp(
          title: 'open url',
          home: Scaffold(
            appBar: AppBar(
              title: Text('hello flutter'),
            ),
            body: Center(
              child: ConstrainedBox(
                  constraints: BoxConstraints(
                      minWidth: 200,
                      minHeight: 100
                  ),
                child: UnconstrainedBox(
                  child: ConstrainedBox(
                    constraints: BoxConstraints(
                        minWidth: 50,
                        minHeight: 50
                    ),
                    child: Container(
                      width: 10,
                      height: 15,
                      color: Colors.red,
                    ),
                  ),
                ),
              ),
            ),
          ),
      );
  }
}

3 运行效果

Flutter之ConstrainedBox、SizedBox、UnconstrainedBox(尺寸限制类容器)

Flutter之ConstrainedBox、SizedBox、UnconstrainedBox(尺寸限制类容器)

Flutter之ConstrainedBox、SizedBox、UnconstrainedBox(尺寸限制类容器)

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
达里尔 达里尔
2年前
在Vue项目里遇到多次渲染echart组件只显示一个的问题
症状vue项目echarts中出现“Thereisachartinstancealreadyinitializedonthedom.”的警告Vue页面多次渲染echarts封装的组件但只出现一个(如果这个为主要症状)原因:1.有可能是id冲突,如果你注册了N个组件,但是由于是复制粘贴过来的,导致你所有的组件文件echarts容器
Souleigh ✨ Souleigh ✨
4年前
React 组件间通信的10种方法
组件间通信方式总结父组件子组件:1.Props2.InstanceMethods子组件父组件:1.CallbackFunctions2.EventBubbling兄弟组件之间:1.ParentComponent不太相关的组件之间:1.Context2.Portals3.Global
Souleigh ✨ Souleigh ✨
3年前
10个略骚的 Vue 开发技巧
路由参数解耦一般在组件内使用路由参数,大多数人会这样做:exportdefaultmethods:getParamsId()returnthis.$route.params.id在组件中使用$route会使之与其对应路由形成高度耦合,从而使组件只
浩浩 浩浩
3年前
【Flutter实战】层叠布局(Stack、Positioned)
4.5层叠布局Stack、Positioned层叠布局和Web中的绝对定位、Android中的Frame布局是相似的,子组件可以根据距父容器四个角的位置来确定自身的位置。绝对定位允许子组件堆叠起来(按照代码中声明的顺序)。Flutter中使用Stack和Positioned这两个组件来配合实现绝对定位。Stack允许子组件堆叠,而Pos
浩浩 浩浩
3年前
【Flutter实战】布局类组件简介
4.1布局类组件简介布局类组件都会包含一个或多个子组件,不同的布局类组件对子组件排版(layout)方式不同。我们在前面说过Element树才是最终的绘制树,Element树是通过Widget树来创建的(通过Widget.createElement()),Widget其实就是Element的配置数据。在Flutter中,根据Widget是否
徐小夕 徐小夕
4年前
《精通react/vue组件设计》之5分钟教你实现一个极具创意的加载(Loading)组件
前言本文是笔者写组件设计的第八篇文章,今天带大家用5分钟实现一个极具创意的加载(loading)组件.涉及的核心知识点主要是css3相关特性,如果大家非常熟悉,可直接跳过介绍直接看正文.时刻问自己:是否具备创造力?笔记前端组件的一般分类:通用型组件:比如Button,Icon等.布局型组件:比如Grid,Layout布
Stella981 Stella981
3年前
FLutter父子组件通信
本文介绍flutter父子组件数据传递和回调.还是以之前的代码为例Flutter\_DayByDay(https://gitee.com/Royce_he/Flutter_DayByDay)由于之前用ReactNative写项目,顺便对比一下RN父组件直接在xml标签中写属性{值/方法},子组件通过props去取属性和方法
融云IM干货丨uni-app中的uni-list 插件具体怎么用?
unilist是uniapp中用于构建列表的组件,以下是具体的使用方法:1.基本用法导入组件:首先,你需要在你的页面或组件中导入unilist和unilistitem组件。例如:javascriptimportuniListfrom'@/component