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等,还有自身元素的大小(盒子模型) )

相关推荐
Jmyd01237 小时前
Web端3D营销展厅技术实现路径:从素材上云到线索回流的数据链路
前端·3d·性能优化·三维数字化
砚凝霜7 小时前
【软考信息安全】第二十二章 Web服务器安全分析与增强——Apache与IIS
服务器·前端·安全
u0111026759 小时前
JPG、PNG、WebP 怎么选?按透明度、体积和使用场景做判断
前端·javascript·vue.js·图像处理·ai作画
jerrywus10 小时前
让 AI 写完代码后交一份报告:我改造了 answer-me-with-html
前端·claude·cursor
派小心.10 小时前
小程序分享链路中来源参数的传递校验
大数据·前端·数据库·人工智能·小程序·数据分析
hhb_61810 小时前
一键生成数据看板,ECharts实战演示
前端·javascript·echarts
Java后端的Ai之路10 小时前
08_React组件API
前端·react.js·前端框架
小马不起床11 小时前
零基础玩转 FastAPI_09:前端基础工程构建
前端·状态模式·fastapi
风骏时光牛马12 小时前
用户管理模块接口开发
前端
彭亚川Allen12 小时前
从零手搓 RAG 之检索全流程,给大模型接上自己的知识库
前端·后端·ai编程