Flutter笔记:Box协议的布局约束原理与应用

简介: Flutter笔记:Box协议的布局约束原理与应用

Flutter笔记Box协议的布局约束原理与应用



1. 概述

在Flutter中,布局约束是决定组件大小和位置的关键因素。理解布局约束的原理,熟悉常见的布局约束组件,以及知道如何在实际应用中使用布局约束,对于创建优秀的Flutter应用至关重要。

本文将详细讲解Flutter中的布局约束原理,包括约束的上下传递,宽约束和紧约束等。我们将介绍常见的布局约束组件,例如ContainerBoxConstraintsAspectRatio等,以及如何使用这些组件来创建复杂的布局。我们还将探讨如何使用特定的组件来突破布局约束,例如OverflowBoxSizedBox等。

2. Flutter中的布局约束原理

在Flutter中,布局约束是决定组件大小和位置的关键因素。布局约束的原理主要包括约束的上下传递,宽约束和紧约束等。

2.1 约束的上下传递

在Flutter中,布局约束的传递是一个从上到下的过程。这个过程可以分为两个步骤:向下传递约束向上传递尺寸

2.1.1 向下传递约束

在布局过程的开始,根组件(通常是Flutter应用的MaterialApp或CupertinoApp组件)会接收到一个来自系统的初始约束。这个初始约束通常是一个宽约束,表示Flutter应用可以在设备屏幕上占用的最大空间。

然后,根组件会根据自己的特性和需求,对这个初始约束进行调整,生成一个新的约束,然后将这个新的约束传递给它的子组件。

子组件接收到父组件传递的约束后,也会进行类似的处理:

  • 根据自己的特性和需求,调整接收到的约束,生成一个新的约束;
  • 然后将这个新的约束传递给它的子组件。
  • 这个过程会一直持续,直到所有的组件都接收到了约束。

2.1.2 向上传递尺寸

当一个组件接收到约束后,它会根据约束来确定自己的尺寸。组件可以自由地选择自己的尺寸,只要这个尺寸满足接收到的约束。

然后,组件会将自己的尺寸传递给父组件。父组件接收到子组件的尺寸后,会根据子组件的尺寸来确定自己的尺寸。这个过程会一直持续,直到所有的组件都确定了自己的尺寸。

2.2 宽约束和紧约束

Flutter 中,布局约束分为 宽约束(Loose Constraints)和 紧约束(Tight Constraints)。这两种约束都包括最小宽度(minWidth)、最大宽度(maxWidth)、最小高度(minHeight)和最大高度(maxHeight)之间的关系,但它们对组件的尺寸要求不同。

2.2.1 紧约束

紧约束表示布局系统在一个组件的尺寸方面要求非常严格。具体而言,对于紧约束,以下关系必须成立:

minWidth <= Size.width <= maxWidth
minHeight <= Size.height <= maxHeight

这意味着组件必须尽量占据尽可能少的空间。紧约束通常用于指示一个组件不应该超出其最小可接受大小的情况。在这种情况下,布局系统会为组件提供尽可能接近其最小大小的空间。

例如,BoxConstraints.tight(Size(100, 100))创建了一个紧约束,要求组件的宽度和高度都必须是100。

2.2.2 宽约束

宽约束表示布局系统允许组件使用更多的可用空间,使其尺寸变得更大。具体而言,对于宽约束,以下关系仍然成立,但布局系统允许组件占据更多的可用空间,而不一定完全使用:

minWidth <= Size.width <= maxWidth
minHeight <= Size.height <= maxHeight

宽约束通常用于指示组件可以根据可用空间的大小进行扩展。在这种情况下,布局系统会为组件提供尽可能多的可用空间,但不会强制组件占据所有可用的空间。

例如,BoxConstraints(minWidth: 0, maxWidth: double.infinity)创建了一个宽约束,允许组件在0到无穷大的范围内选择自己的宽度。

2.3 如何计算布局约束

Flutter 中,布局约束的计算是通过 layout 方法进行的。layout 方法是 RenderObject 类的一个方法,所有的组件最终都会被转换为 RenderObject

layout方法接收一个BoxConstraints对象,这个对象描述了组件可以接受的最小和最大宽度和高度。layout 方法需要计算出组件的大小,并返回一个Size对象。

以下是layout方法的基本步骤:

  1. 首先,layout 方法会检查传入的 BoxConstraints 对象,确保它是有效的。如果 BoxConstraints 对象无效(例如,最大宽度小于最小宽度),layout方法会抛出一个异常。
  2. 然后,layout 方法会调用 performLayout 方法。performLayout 方法是 RenderObject 类的一个抽象方法,每个 RenderObject 子类都需要实现这个方法。在 performLayout方法中,RenderObject 会根据传入的 BoxConstraints 对象来计算自己的大小。
  3. performLayout方法计算出 RenderObject 的大小后,会将这个大小保存在 RenderObject 的size属性中。然后,layout方法会返回这个size属性。

3. 常见的布局约束组件

在Flutter中,有许多组件可以用来设置和调整布局约束。以下是一些常见的布局约束组件:

3.1 Container

Container 是一个方便的组合组件,它可以同时设置多种布局属性,包括宽度、高度、边距、填充、装饰等。Container组件的width和height属性可以用来设置宽约束和紧约束。

例如,以下代码创建了一个宽度和高度都为100的Container组件:

Container(
  width: 100,
  height: 100,
  color: Colors.red,
)

3.2 BoxConstraints

**BoxConstraints ** 是一个描述布局约束的对象。我们可以使用 BoxConstraints 对象来创建宽约束和紧约束。

例如,以下代码创建了一个最小宽度为50,最大宽度为150,最小高度为100,最大高度为200的 BoxConstraints 对象:

BoxConstraints(
  minWidth: 50,
  maxWidth: 150,
  minHeight: 100,
  maxHeight: 200,
)

3.3 AspectRatio

AspectRatio 组件可以用来设置组件的宽高比。AspectRatio 组件的 aspectRatio 属性表示宽度和高度的比例。

例如,以下代码创建了一个宽高比为16:9的AspectRatio组件:

AspectRatio(
  aspectRatio: 16 / 9,
  child: Image.network('https://example.com/image.jpg'),
)

以上就是 Flutter 中常见的布局约束组件。理解这些组件的作用和使用方法,对于理解和使用 Flutter 的布局系统至关重要。

4. 打破约束的组件

Flutter 中,可以使用 OverflowBoxUnconstrainedBox 等组件来打破约束。

4.1 OverflowBox

OverflowBox 组件可以用来突破父组件的约束,允许子组件根据自己的大小进行布局,即使这个大小超出了父组件的约束。

例如,以下代码创建了一个 OverflowBox 组件,它的子组件是一个宽度和高度都为 300 的 Container组件,即使这个大小超出了父组件的约束:

OverflowBox(
  minWidth: 0.0, 
  minHeight: 0.0,
  maxWidth: double.infinity,
  maxHeight: double.infinity,
  child: Container(
    width: 300,
    height: 300,
    color: Colors.red,
  ),
)

4.2 UnconstrainedBox

UnconstrainedBox 组件不会对其子组件施加任何约束,允许子组件根据自己的大小进行布局。

例如,以下代码创建了一个 UnconstrainedBox 组件,它的子组件是一个宽度和高度都为300的 Container 组件,即使这个大小超出了父组件的约束:

UnconstrainedBox(
  child: Container(
    width: 300,
    height: 300,
    color: Colors.red,
  ),
)

4.3 SizedOverflowBox

SizedOverflowBox 组件有一个size属性,它可以强制其子组件具有特定的宽度和高度,即使这个宽度和高度超出了父组件的约束。同时,它允许其子组件溢出其设定的尺寸。

例如,以下代码创建了一个 SizedOverflowBox 组件,它的 size 属性被设置为 Size(100, 100),但它的子组件是一个宽度和高度都为 300 的 Container 组件,即使这个大小超出了 SizedOverflowBox 设定的尺寸:

SizedOverflowBox(
  size: Size(100, 100),
  child: Container(
    width: 300,
    height: 300,
    color: Colors.red,
  ),
)

在这个例子中,Container 组件的尺寸超出了 SizedOverflowBox 设定的尺寸,但 SizedOverflowBox 允许这种溢出。

目录
相关文章
|
11月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1038 4
|
6月前
|
存储 Android开发
如何查看Flutter应用在Android设备上已被撤销的权限?
如何查看Flutter应用在Android设备上已被撤销的权限?
278 64
|
14天前
|
缓存 自然语言处理 Dart
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
蒋星熠Jaxonic,Flutter技术探索者。深耕跨平台开发,专注自绘引擎、性能调优与工程化实践。从渲染原理到生产落地,分享可复用的架构思维与最佳实践,助力开发者打造高效稳定的应用体验。
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
|
8月前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
438 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
11月前
|
缓存 监控 前端开发
优化 Flutter 应用启动速度的策略,涵盖理解启动过程、资源加载优化、减少初始化工作、界面布局优化、异步初始化、预加载关键数据、性能监控与分析等方面
本文探讨了优化 Flutter 应用启动速度的策略,涵盖理解启动过程、资源加载优化、减少初始化工作、界面布局优化、异步初始化、预加载关键数据、性能监控与分析等方面,并通过案例分析展示了具体措施和效果,强调了持续优化的重要性及未来优化方向。
447 10
|
8月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
515 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
8月前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
207 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
10月前
|
存储 容器
Flutter 构建自适应布局
Flutter 构建自适应布局
283 2
Flutter 构建自适应布局
|
11月前
|
存储 调度 数据安全/隐私保护
鸿蒙Flutter实战:13-鸿蒙应用打包上架流程
鸿蒙应用打包上架流程包括创建应用、打包签名和上传应用。首先,在AppGallery Connect中创建项目、APP ID和元服务。接着,使用Deveco进行手动签名,生成.p12和.csr文件,并在AppGallery Connect中上传CSR文件获取证书。最后,配置签名并打包生成.app文件,上传至应用市场。常见问题包括检查签名配置文件是否正确。参考资料:[应用/服务签名](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-signing-V5)。
624 3
鸿蒙Flutter实战:13-鸿蒙应用打包上架流程
|
11月前
|
开发框架 数据安全/隐私保护 开发者
Flutter 是一款强大的跨平台移动应用开发框架,本文深入探讨了其布局与样式设计
Flutter 是一款强大的跨平台移动应用开发框架,本文深入探讨了其布局与样式设计,涵盖布局基础、常用组件、样式设计、实战应用、响应式布局及性能优化等方面,助力开发者打造精美用户界面。
277 7