flutter 约束(constrains )实例研究(上)

简介: flutter 约束(constrains )实例研究

大家好,我是 17。

如果你是 web 前端开发,你一定会这样的体会, wigth,height 都是作用于 element 本身

<div style='width:100px;height:100px; ></div>
复制代码

在页面中,这个 div  的高宽一定是 100 高 100 宽的。带着这样的认识,当你学习 flutter的时候,很容易会觉得 container 的 width ,height,也是这样的作用。但事实上,container 的 width ,height 只是约束,container 实际的尺寸是由约束,孩子的尺寸,和本身的规则一起决定的。

flutter 中的布局遵循这样的原则 constrains go down ,sizes go up. Parent sets position. 直译过来就是 constrains 向下传递,sizes 向上传递。parent 决定尺寸。

constrains class

因为 constrains 是抽象类,所以 看看 boxConstrains 的构造函数

const BoxConstraints({
    this.minWidth = 0.0,
    this.maxWidth = double.infinity,
    this.minHeight = 0.0,
    this.maxHeight = double.infinity,
  }) 
复制代码

一共有四个值。默认值的意思是 尺寸可以随意,没有限制。特别的,最大最小值相同的 contains 称为 tight constrains,最小值为0 的 contains 称为 loose contains。一般来说,只要最大最小不相同的都可以看成是 loose constrains。

下面我会举例子,不用 container ,因为它是一个复合 widget,比较复杂。因为是研究 contrasins,所以只用最简单的 widget。第一个例子会给出完整代码,后面的例子只给出关键代码。

我是用 chrome,renderView 调整为 500  x 296,具体多少不重要,你只要知道看到这个数值就是满屏就行了。

例一

9314caff760a42809ffec3ef354f751a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


import 'package:flutter/material.dart';
void main() {
  runApp(const MyApp());
}
class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return const DecoratedBox(decoration: BoxDecoration(color: Colors.green));
  }
}
复制代码

把上面的代码 copy 到 main.dart中,执行,会发现全屏都是绿色。其间发生了如下的沟通过程。

  1. app 告诉 DecoratedBox, 你的尺寸必须是 500 x 296
  2. DecoratedBox 显示为 500 x 296

app 是如何告诉 DecoratedBox 的呢,是传 constrains 给 DecoratedBox

constraints: BoxConstraints(w=500.0, h=296.0)
复制代码

例二

64e91affe7e04fbd9476819b5a6fd600_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

const Center(child: DecoratedBox(decoration: BoxDecoration(color: Colors.green)));
复制代码

当用 Center 包装后,什么都不会显示。这涉及到 DecoratedBox 自身的规则,它会尽量小。

  1. app 告诉 Center, 你的尺寸必须是 500 x 296
  2. Center 告诉 DecoratedBox 你可以显示为任意尺寸,只要别超过 500 x 296
  3. DecoratedBox 最小可以显示为 0 ,所以我们就看不见了。

Center 传给 DecoratedBox 的约束

constraints: BoxConstraints(0.0<=w<=500.0, 0.0<=h<=296.0)
复制代码

Center 继承 自 Align。 Align 的一个功能就是把 tight 约束 转为 loose 约束

例三


3e3b408ebdad40d1a558466672d4c1ff_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

Center(
        child: ConstrainedBox(
            constraints: const BoxConstraints(minWidth: 100, minHeight: 100),
            child: const DecoratedBox(
                decoration: BoxDecoration(color: Colors.green))));
复制代码

DecoratedBox 获得了最小尺寸约束,所以它只好显示为 100 x 100

每次都写全四个属性有点麻烦,所以 ConstrainedBox 给出了快捷构造函数,拿 tight举例,其它就不再赘述了。

BoxConstraints.tight(Size size)

Size只有两个参数,width,height

const Size(double width, double height)
复制代码

用 BoxConstraints.tight可以构造出 最大最小相等的约束。

BoxConstraints.tight(Size(width:100,height:100)
复制代码

等价于

BoxConstraints(minWidth: 100, minHeight: 100,maxHeight: 100,maxWidth: 100)
复制代码

例四


3e3b408ebdad40d1a558466672d4c1ff_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

const Center(
        child: SizedBox(
            width: 100,
            height: 100,
            child:  DecoratedBox(
                decoration: BoxDecoration(color: Colors.green))));
复制代码

用 SizedBox 可以达到同样的效果,而且代码更简洁些。和 ConstrainedBox 相比,SizedBox 只能构造 tight 约束。

例五

3e3b408ebdad40d1a558466672d4c1ff_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

const Center(
        child: SizedBox(
            width: 100,
            height: 100,
            child:SizedBox(
              width: 300,
              height:300,
            child:  DecoratedBox(
                decoration: BoxDecoration(color: Colors.green))))
            );
复制代码

可能你会认为 box 会显示为 300 x 300,但实际上是 100 x 100,这是因为 SizedBox,ConstrainedBox 把综合父级和自身的 contains ,处理后传给子级。

因为父级传过来的是 tight 约束 SizedBox,ConstrainedBox 会忽略自身的约束。所以显示为 100 x100

目录
相关文章
|
17天前
深入理解Flutter鸿蒙next版本 中的Widget继承:使用extends获取数据与父类约束
本文详细介绍了Flutter中如何通过继承其他Widget来创建自定义组件。首先解释了Widget继承的基本概念,包括StatelessWidget和StatefulWidget的区别。接着通过具体示例展示了如何继承StatelessWidget和StatefulWidget,并在子类中访问父类的build方法和状态。最后,结合多个自定义Widget展示了如何在实际应用中灵活使用继承和组合来构建复杂的UI。
68 8
|
6月前
|
容器
Flutter笔记:Box协议的布局约束原理与应用
Flutter笔记:Box协议的布局约束原理与应用
92 0
|
前端开发 容器
重识Flutter — 探索Slivers的奇妙世界(综合实例)
本文将通过一个炫酷的综合案例来帮助你理解Slivers,和我一起继续探索Sliver的世界,利用其强大的特性和灵活的组合方式,创建出更加有趣和具有交互性的滚动界面吧!
Flutter Button 实例
Flutter Button 实例
160 0
Flutter Button 实例
|
算法 容器
flutter 约束(constrains )实例研究(下)
flutter 约束(constrains )实例研究(下)
162 0
flutter 约束(constrains )实例研究(下)
|
Dart
[Flutter]足够入门的Dart语言系列之面向对象:类的定义详解、成员和实例使用
类表示的是分类,一类问题或事物,它是对具体或现实世界的抽象。比如动物类、犬科动物类、猫科动物类、房子类、数学类,类是具体事物的描述,它不是指具体的某个动物、某栋房子、某个数学题,而是对它们的概括...
335 0
[Flutter]足够入门的Dart语言系列之面向对象:类的定义详解、成员和实例使用
|
Dart 测试技术 API
【Flutter】大型项目里Flutter测试应用实例以及集成测试的深度使用
【Flutter】大型项目里Flutter测试应用实例以及集成测试的深度使用
|
容器
Flutter 68: 图解基本约束 Box (三)
0 基础学习 Flutter,第六十八步:学习以下基本约束 Box (三)!
1231 0