flutter第二话题-布局约束

1.背景

开始看 flutter 的约束时,感觉非常难理解。一会紧约束,一会松约束,布局大小跟自己想象的为什么不一样。这个记录讨论一下自己的见解。有不对的地方欢迎指出。

2.flutter约束

布局中会有各种盒子大小,真实渲染盒子大小和预设可能不一样,这一切都是约束在起作用。 一句话:父向下传递约束,子向上传递宽高。 如何理解这句话,就很重要。

这里举几个例子:

2.1 一些例子很重要

js 复制代码
Column(
        children: [
          Container( // 我听指挥,没有宽高,下级你自由发挥
            color: Colors.pink,
            child: Text( // 我听父级的,自由展示宽度
                '我想要200x200sa;lfjsadjf;sajfsa;fjsafjsal;fjsa;lfjsa;lfjsa;ldfjsad;lfjsald;jfl;sadjfl;safjls;afjs;afjsal;fjsdajfdlsa'),
          ),
          Container( // 我听指挥,必须200*200
            color: Colors.yellow,
            width: 200,
            height: 200,
            child: Text( // 父级告诉我,我必须200*200 我的空间只有200*200
                '我想要200x200sa;lfjsadjf;sajfsa;fjsafjsal;fjsa;lfjsa;lfjsa;ldfjsad;lfjsald;jfl;sadjfl;safjls;afjs;afjsal;fjsdajfdlsa'),
          ),
          Container( // 我听指挥,必须200*200,下级你是200*200
            color: Colors.yellow,
            width: 200,
            height: 200,
            child: Container( // 我听指挥,必须100*100 ,但是父级告诉我,min是200.所以我是200*200
              color: Colors.red,
              width: 100,// 不生效
              height: 100,//不生效
              child: Text( // 父级告诉我有200*200
                  '我想要200x200sa;lfjsadjf;sajfsa;fjsafjsal;fjsa;lfjsa;lfjsa;ldfjsad;lfjsald;jfl;sadjfl;safjls;afjs;afjsal;fjsdajfdlsa'),
            ),
          ),
          Center(
            child: Container( // 我听指挥,必须200*200
              color: Colors.yellow,
              width: 200,
              height: 200,
              child: Center( // 我听父级的,我是200*200 。但是我好说话,下级你可以是0<widht<200
                child: ConstrainedBox(// 我听指挥,最大100.但是父级告诉我,我可以0<widht<200。我在这个区间内,我就是 0-100.
                  constraints: const BoxConstraints(
                    maxWidth: 100, // 宽松约束:最大100宽
                    maxHeight: 100, // 宽松约束:最大100高
                  ),
                  child: Container( // 我听指挥,没有。我听父级的,0-100.所以我是100.
                    color: Colors.red.withOpacity(0.3), 
                    child: const Text(  // 我听父级的,0-100
                      '这是一段很长的文本内容,会自动换行并撑开到最大100x100的空间限制内',
                      style: TextStyle(fontSize: 12),
                    ),
                  ),
                ),
              ),
            ),
          ),
          Center(
            child: Container( // 我听指挥,必须200*200
              color: Colors.yellow,
              width: 200, 
              height: 200,

              child: ConstrainedBox( // 我听指挥,0-100.但是父级告诉我,最小200.所以我是200*200
                constraints: const BoxConstraints(
                  maxWidth: 100, // 不生效
                  maxHeight: 100, // 不生效
                ),
                child: Container(// 我听指挥,没有,我听父级的200*200.我好说话,下级你可以0-200
                  color: Colors.red.withOpacity(0.3), // 添加背景色看清楚边界
                  child: const Text( // 我听父级的 0-200
                    '这是一段很长的文本内容,会自动换行并撑开到最大100x100的空间限制内',
                    style: TextStyle(fontSize: 12),
                  ),
                ),
              ),
            ),
          ),
        ],

3.如何理解这些问题

总结:记住以下一些标志:

  1. 紧约束标志(width/height),宽松约束标志(minWidth/maxWidth minHeight/minHeight),无约束:无宽高

  2. 子元素永远不能超出父级宽度,超出发生越界,越界是不合理的

  3. 父级约束,自己的约束,自身大小 共同决定渲染元素的大小 (指明的约束:Container/SizedBox/BoxConstraints 等,隐藏的约束:Center,Warp,Flex等,还有自身元素的大小(盒子模型) )

相关推荐
zhangxingchao3 小时前
Kotlin常用的Flow 操作符整理
前端
IT_陈寒5 小时前
React的useState居然还有这种坑?我差点删库跑路
前端·人工智能·后端
Pedantic6 小时前
SwiftUI 手势笔记
前端·后端
橙子家6 小时前
浏览器缓存之【结构化数据库与缓存】: IndexedDB、Cache storage 和 Storage buckets
前端
user20585561518136 小时前
X6 中边悬浮置顶,规避 `mouseleave` 事件丢失问题
前端
李明卫杭州7 小时前
CSS aspect-ratio 属性完全指南
前端
Pedantic8 小时前
SwiftUI 手势层级(Gesture Hierarchy)详解
前端
飘尘9 小时前
前端转型全栈(Java后端)的快速上手指引
前端·后端·全栈
一颗烂土豆9 小时前
Meshopt 压缩深度解析,为什么它比 Draco 更快
前端·javascript·webgl