Flutter 68: 图解基本约束 Box (三)

      小菜对约束 Box 探索之路还在继续,小菜今天主要学习一下 Overflow 相关 Box

OverflowBox

源码分析

class OverflowBox extends SingleChildRenderObjectWidget {
  const OverflowBox({
    Key key,
    this.alignment = Alignment.center,  // 对齐方式
    this.minWidth,                      // 允许最小宽度
    this.maxWidth,                      // 允许最大宽度
    this.minHeight,                     // 允许最小高度
    this.maxHeight,                     // 允许最大高度
    Widget child,
  })
}

      分析源码可得,OverflowBox 通过设置最大最小宽高对子 Widget 进行约束,且与父 Widget 相关,子 Widget 可能会溢出父 Widget

案例尝试

      小菜通过如下几种场景探索 OverflowBox 与父 Widget 和子 Widget 的关联关系,其中 alignment 是通用的对齐方式,不在此单独说明;由于 OverflowBox 允许子 Widget 溢出父 Widget,很多朋友用此实现自定义 Dialog

  1. Widget 无约束,仅设置 minWidth / minHeight,子 Widget 宽高小于等于 OverflowBox 最小宽高;此时 child.width <= minWidth && child.height <= minHeight,最终以 OverflowBox 设置的最小宽高约束子 Widget
return Container(color: Colors.blueAccent.withOpacity(0.4),
    child: OverflowBox(alignment: Alignment.center, minHeight: 100,
        child: Container(color: Colors.purple.withOpacity(0.4), width: 50, height: 50)));
  1. Widget 无约束,仅设置 minWidth / minHeight,子 Widget 宽高大于 OverflowBox 最小宽高;此时 minWidth < child.width < maxWidth,最终以子 Widget 设置的宽高展示;
 return Container(color: Colors.green.withOpacity(0.4),
    child: OverflowBox(alignment: Alignment.center, minHeight: 100, minWidth: 100,
        child:Container(color: Colors.purple.withOpacity(0.4), width: 150, height: 150)));
  1. Widget 无约束,设置 maxWidth / maxHeight,若 child.width > maxWidth || child.height > maxHeight 则以 OverflowBox 设置的最大宽高约束子 Widget;若 child.width < maxWidth && child.height < maxHeight 则按照上述两种情况进行约束;
return Container(color: Colors.orange.withOpacity(0.4),
    child: OverflowBox(alignment: Alignment.center,
        minHeight: 100, maxWidth: 150, maxHeight: 150,
        child: Container(color: Colors.purple.withOpacity(0.4), width: 50, height: 50)));
return Container(color: Colors.grey.withOpacity(0.4),
    child: OverflowBox(alignment: Alignment.center,
        minHeight: 100, minWidth: 100, maxWidth: 150, maxHeight: 150,
        child: Container(color: Colors.purple.withOpacity(0.4), width: 200, height: 200)));
  1. Widget 有约束,设置 maxWidth > parent.width || maxHeight > parent.height,此时允许子 Widget 宽高大于父 Widget 宽高,其约束方式与上述情况相同;
return Container(width: 200, height: 200, color: Colors.brown.withOpacity(0.4),
    child: OverflowBox(alignment: Alignment.center,
        minHeight: 100, minWidth: 50, maxHeight: 250, maxWidth: 250,
        child: Container(color: Colors.purple.withOpacity(0.4))));
  1. 对于大部分涉及最大最小宽高的 Widget,最小宽高均不允许大于最大宽高,使用时请注意;
return Container(width: 200, height: 200, color: Colors.brown.withOpacity(0.4),
    child: OverflowBox(alignment: Alignment.center,
        minHeight: 250, minWidth: 50,
        child: Container(color: Colors.purple.withOpacity(0.4))));

SizedOverflowBox

源码分析

class SizedOverflowBox extends SingleChildRenderObjectWidget {
  const SizedOverflowBox({
    Key key,
    @required this.size,                // 约束 Size
    this.alignment = Alignment.center,  // 对齐方式
    Widget child,
  })
}

      分析源码可知,SizedOverflowBoxSizedBoxOverflowBox 的结合,小菜简单理解 SizedBox 设置基本约束,OverflowBox 设置子 Widget 与父 Widget 关系,是否溢出;

案例尝试

      size 是对子 Widget 的基本尺寸约束,alignment 是通用的对齐方式,小菜按如下场景进行尝试;

  1. Widget 无约束,若 child.width <= Size.x && child.height <= Size.y,以子 Widget 宽高约束展示;
return Container(color: Colors.green.withOpacity(0.4),
    child: Center(child: SizedOverflowBox(
        size: Size(100, 100), alignment: Alignment.center,
        child: Container(width: 50, height: 50, color: Colors.blueAccent.withOpacity(0.6)))));
  1. Widget 无约束,若 child.width > Size.x || child.height > Size.h,以子 Widget 宽高溢出展示;
return Container(color: Colors.orange.withOpacity(0.4),
    child: Center(child: SizedOverflowBox(
        size: Size(100, 100), alignment: Alignment.center,
        child: Container(width: 150, height: 150, color: Colors.purple.withOpacity(0.4)))));
  1. Widget 有约束时,若 child.width <= Size.x && child.height <= Size.y 时,与状况一相同;若 child.width > parent.width >= Size.x || child.height > parent.height >= Size.y,则子 Widget 溢出 SizedOverflowBox 到父 Widget 约束宽高展示;
return Container(width: 150, height: 150, color: Colors.redAccent.withOpacity(0.4),
    child: Center(child: SizedOverflowBox(
        size: Size(100, 100), alignment: Alignment.center,
        child: Container(width: 250, height: 50, color: Colors.grey.withOpacity(0.8)))));
  1. Widget 有约束时,若 Size.x > parent.width || Size.y > parent.height,最终展示的最大宽高是父 Widget 约束的宽高(子 Widget 溢出或非溢出);
return Container(width: 150, height: 150, color: Colors.redAccent.withOpacity(0.4),
    child: Center(child: SizedOverflowBox(
        size: Size(400, 400), alignment: Alignment.topLeft,
        child: Container(width: 150, height: 50, color: Colors.grey.withOpacity(0.8)))));

小理解

      小菜尝试了诸多约束 Box,甚至有些 Box 在使用和功能上大同小异,相同的功能,可以用其他的 Widget 来实现但为什么要有这么多约束 Box

      小菜对此理解还不够深入,仅简单的交流个人理解,如有错误请多多指导!对于常用的 SizedBox 既可以用作约束盒子也可以作为空间占位符,对此 Container 完全可以实现,还可以实现很多复杂效果;SizedBox 存在的理由:小菜认为一是 SizedBox 功能更单一,相对于 Container 性能更好(Flutter 渲染性能很高,可以忽略不计);二是 SizedBox 功能性更加清晰明确;合理利用各 Widget 会让编码更加清晰高效;


      小菜对约束 Box 的探索暂时到此,希望大家可以对各类 Box 多多尝试!

来源: 阿策小和尚

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,999评论 4 368
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,102评论 1 302
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,709评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,439评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,846评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,881评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,062评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,783评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,517评论 1 248
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,762评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,241评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,568评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,236评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,145评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,941评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,965评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,802评论 2 275

推荐阅读更多精彩内容