Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >《Flutter》-- 5.Flutter页面布局

《Flutter》-- 5.Flutter页面布局

作者头像
爱学习的程序媛
发布于 2022-04-07 08:22:29
发布于 2022-04-07 08:22:29
1.2K00
代码可运行
举报
文章被收录于专栏:学习/读书笔记学习/读书笔记
运行总次数:0
代码可运行

参阅书籍:

Flutter跨平台开发入门与实践》-- 向治洪(著)

5. Flutter页面布局

5.1 盒约束模型

盒约束是指组件可以按照指定限制条件来决定如何布局自身位置。Flutter提供的尺寸限制类容器可以用于限制容器的大小,并提供了多种约束容器组件,常见的有ConstrainedBox、SizedBox和UnconstrainedBox。

5.1.1 ConstrainedBox

用来对子组件添加额外的约束。

构造函数格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ConstrainedBox({
  Key key,
  @required this.constraints,//给子组件添加额外的约束
  Widget child,
})

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() => runApp(BoxWidget());

class BoxWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '盒约束模型',
      home: Scaffold(
        appBar: AppBar(title: Text('盒约束模型--ConstrainedBox')),
        body: ConstrainedBox(
            constraints: BoxConstraints(
              minWidth: 50,
              maxWidth: 100,
              minHeight: 50,
              maxHeight: 100
            ),
            child: Container(
              width: 80,
              height: 5,
              child: DecoratedBox(
                decoration: BoxDecoration(
                  color: Colors.red
                )
              )
            )
         )
      )
    );
  }
}

示例效果:

BoxConstraints常见的构造函数:

1)BoxConstraints.tight():创建一个生成给定大小的限制约束布局;

2)BoxConstraints.expand():创建一个尽可能大的用于填充另一个容器的约束布局;

3)BoxConstraints.tightForFinite():创建一个最大值是确定值的松散约束布局;

4)BoxConstraints.tightFor():创建一个不限最大值的松散约束布局。

5.1.2 SizedBox

用于给子组件指定固定的宽高。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() => runApp(BoxWidget());

class BoxWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '盒约束模型',
      home: Scaffold(
        appBar: AppBar(title: Text('盒约束模型--SizedBox')),
        body: SizedBox(
            width: 100,
            height: 100,
            child: Container(
              width: 80,
              height: 5,
              child: DecoratedBox(
                decoration: BoxDecoration(
                  color: Colors.red
                )
              )
            )
         )
      )
    );
  }
}

示例效果:

5.1.3 UnconstrainedBox

不会对子组件产生任何限制,它允许子组件按照自己本身的大小进行绘制,可以去除多重约束的限制。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() => runApp(BoxWidget());

class BoxWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '盒约束模型',
      home: Scaffold(
        appBar: AppBar(title: Text('盒约束模型--UnconstrainedBox')),
        body: ConstrainedBox(
            constraints: BoxConstraints(
              minWidth: 100,
              minHeight: 100,
            ),
            child: UnconstrainedBox(
              child: Container(
                width: 50,
                height: 50,
                color: Colors.red
              )
            )
        )
      )
    );
  }
}

示例效果:

UnconstrainedBox对父级的约束并非是真正的去除,父组件的限制依然生效,只不过它不影响子组件显示大小,但仍然会占据相应的空间。

5.2 线性布局

线性布局指的是沿水平或垂直方向排布子组件的布局方式。Flutter使用Row或Column来实现线性布局,作用类似于Android的线性布局(LinearLayout),且Row和Column都继承自弹性布局。

线性布局有主轴和纵轴之分。如果布局沿水平方向排列,那么水平方向就是主轴,垂直方向为纵轴;如果布局沿垂直方向排列,那么垂直方向就是主轴,水平方向为纵轴。

Row表示在水平方向排列子组件,Column表示在垂直方向排列子组件,支持的属性如下:

1)mainAxisAlignment:表示子组件在主轴的对齐方式;

2)mainAxisSize:表示主轴应该占用多大空间;

3)crossAxisAlignment:表示子组件在交叉轴的对齐方式;

4)textDirection:表示子组件在主轴方向上的布局顺序;

5)verticalDirection:表示子组件在交叉轴方向上的布局顺序;

6)textBaseline:排列子组件时使用的基线标准;

7)children:线性布局里排列的内容。

5.3 弹性布局

Flutter中使用Flex来实现弹性布局,类似于CSS的FlexBox,支持的属性如下:

1)direction:主轴的方向;

2)mainAxisAlignment:子组件在主轴的对齐方式;

3)mainAxisSize:主轴占用的空间大小;

4)crossAxisAlignment:子组件在交叉轴的对齐方式;

5)textDirection:子组件在主轴方向上的布局顺序;

6)verticalDirection:子组件在交叉轴方向上的布局顺序;

7)textBaseline:排列子组件时使用的基线标准;

8)children:弹性布局里排列的内容。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() => runApp(FlexWidget());

class FlexWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '页面布局',
      home: Scaffold(
        appBar: AppBar(title: Text('页面布局--弹性布局')),
        body: Flex(
          direction: Axis.horizontal,
          mainAxisAlignment: MainAxisAlignment.start,
          children: <Widget>[
            Expanded(
              flex: 1,
              child: Container(
                height: 50,
                color: Colors.red
              ),
            ),
            Expanded(
              flex: 1,
              child: Container(
                height: 50,
                color: Colors.green
              ),
            ),
             Expanded(
              flex: 1,
              child: Container(
                height: 50,
                color: Colors.blue
              ),
            ),
          ],
        )
      )
    );
  }
}

示例效果:

Flex组件与Expanded组件可以让Row、Column、Flex的子组件具有弹性能力。当子组件超过主轴的大小时会自动换行;当还有剩余空间时,Expanded组件会占满剩余的所有空间,而Flexible组件只会占用自身大小的空间。

5.4 流式布局

流式布局指的是页面元素的宽度可以根据屏幕的分辨率适配调整,但整体布局风格保持不变。

Flutter中使用Wrap来实现流式布局,支持的属性如下:

1)direction:主轴的方向,默认是Axis.horizontal;

2)alignment:子组件在主轴上的对齐方式;

3)runAlignment:流式布局会自动换行或换列,runAlignment属性指的是每行或每列的对齐方式;

4)runSpacing:每行或每列的间距,默认是0.0;

5)crossAxisAlignment:子组件在交叉轴上的对齐方式;

6)textDirection:子组件在主轴方向上的布局顺序;

7)verticalDirection:子组件在交叉轴方向上的布局顺序;

8)children:流式布局里的子组件。 示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() => runApp(WrapWidget());

class WrapWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '页面布局',
      home: Scaffold(
        appBar: AppBar(title: Text('页面布局--流式布局')),
        body: Wrap(
          spacing: 8,
          runSpacing: 4,
          children: <Widget>[
            Chip(
              avatar: CircleAvatar(
                backgroundColor: Colors.blue,
                child: Text('S')
              ),
              label: Text('少年的你'),
            ),
            Chip(
              avatar: CircleAvatar(
                backgroundColor: Colors.blue,
                child: Text('Z')
              ),
              label: Text('中国机长'),
            ),
            Chip(
              avatar: CircleAvatar(
                backgroundColor: Colors.blue,
                child: Text('W')
              ),
              label: Text('我和我的祖国'),
            ),
            Chip(
              avatar: CircleAvatar(
                backgroundColor: Colors.blue,
                child: Text('Z')
              ),
              label: Text('终结者:黑暗命运'),
            ),
          ]
        )
      )
    );
  }
}

示例效果:

5.5 层叠布局

层叠布局是指子组件可以根据父组件的位置来确定自身位置的布局。层叠布局允许子组件以堆叠的方式来排列子组件,它和Web中的绝对定位、Android中的Frame布局类似。

Flutter使用StackPositioned两个组件来配合实现绝对定位,Stack组件主要用于子组件的堆叠操作,而Positioned组件则用于确定子组件在Stack组件中的位置。

层叠布局支持的属性如下:

1)alignment:决定如何去对齐没有定位或者部分定位的子组件;

2)textDirection:用于确定alignment的对其方向;

3)fit:用于决定non-positioned子组件如何去适应层叠布局的大小;

4)overflow:当子组件超出Stack组件的范围时,决定如何显示超出的子组件;

5)children:Stack组件里排列的内容。

在层叠布局中,先排列的子组件会出现在视图的底部,后排列的则会显示在上面。Stack组件将子组件分为无定位的子组件和有定位的子组件。

无定位的子组件不被Positioned组件嵌套,需要设置alignment属性来确定自己在父组件里面的位置。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() => runApp(StackWidget());

class StackWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '页面布局',
      home: Scaffold(
        appBar: AppBar(title: Text('页面布局--层叠布局')),
        body: Stack(
          alignment: const Alignment(0, 0),
          children: <Widget>[
            Container(
              constraints: BoxConstraints.tightFor(width: 200, height: 150),
              decoration: BoxDecoration(
                gradient: RadialGradient(
                  colors: [Colors.red, Colors.orange],
                  center: Alignment.topLeft,
                  radius: .98
                ),
              ),
            ),
            Text(
              'Hello Flutter',
              style: TextStyle(
                fontSize: 24,
                color: Colors.white
              )
            )
          ],
        )
      )
    );
  }
}

示例效果:

有定位的子组件被Positioned组件嵌套,Positioned组件可以控制子组件到父组件4条边的距离。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() => runApp(StackWidget());

class StackWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '页面布局',
      home: Scaffold(
        appBar: AppBar(title: Text('页面布局--层叠布局')),
        body: Stack(
          children: <Widget>[
            Positioned(
              left: 30, 
              top: 40,
              child: Container(
                constraints: BoxConstraints.tightFor(width: 200, height: 150),
                decoration: BoxDecoration(
                  gradient: RadialGradient(
                    colors: [Colors.red, Colors.orange],
                    center: Alignment.topLeft,
                    radius: .98
                  ),
                ),
              ), 
            ),
            Positioned(
              left: 60, 
              top: 105,
              child: Text(
                'Hello Flutter',
                style: TextStyle(
                  fontSize: 24,
                  color: Colors.white
                )
              )
            ),
          ],
        )
      )
    );
  }
}

示例效果:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爱学习的程序媛 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Flutter跨平台移动端开发丨Column、Row、Flex、Wrap、Flow、Stack
flex 可以按水平或垂直方向排列子 widget,并且允许子 widget 按照比例分配父 widget 的空间,row 和 column 均继承自 flex
码脑
2019/05/25
2.1K0
7.Flutter学习之Stack层叠组件、Stack与Align Stack 与Positioned实现 RelativeLayout
笔录Flutter(五)布局系列:Stack层叠组件、Stack与Align Stack 与Positioned实现 RelativeLayout 相比学习过Android的同学们应该都清楚什么是RelativeLayout。这里就不进行解释了。直接看内容吧。
易帜
2022/02/09
5030
7.Flutter学习之Stack层叠组件、Stack与Align Stack 与Positioned实现 RelativeLayout
『Flutter』布局组件 Container、Row、Column、Stack
经过上一篇文章,开发出来了第二个 Flutter 程序,接下来是给大家详细的介绍下 Flutter 的布局组件。
杨不易呀
2024/01/15
2.1K0
『Flutter』布局组件 Container、Row、Column、Stack
Flutter 中 Wrap组件
Wrap 可以实现流布局,单行的 Wrap 跟 Row 表现几乎一致,单列的 Wrap 则跟 Row 表 现几乎一致。但 Row 与 Column 都是单行单列的,Wrap 则突破了这个限制,mainAxis 上空 间不足时,则向 crossAxis 上去扩展显示。
越陌度阡
2020/12/23
1.1K0
Flutter 中 Wrap组件
Flutter | 布局组件
布局类组件都会包含一个或多个组件,不同的布局类组件对子组件(layout)方式不同。在 Flutter 中 Element 树才是最终的绘制树,Element 树是通过 Widget 树来创建的 (通 Widget.createElement()) ,Widget 其实就是 Element 的配置数据。
345
2022/02/11
2.9K0
Flutter | 布局组件
从Container尺寸之谜看Flutter的渲染规则
先来看看最简单的情况,如果Container没有Child,代码如下所示。
用户1907613
2019/04/09
1.8K0
从Container尺寸之谜看Flutter的渲染规则
Flutter 中 Padding、Row 、Column 、Expanded 组件详解
在 html 中常见的布局标签都可以使用 padding 属性,但是 Flutter 中很多 Widget 是没有 padding 属 性,这个时候我们可以用 Padding 组件处理容器与子元素直接的间距。
越陌度阡
2020/12/22
1.9K0
Flutter 中 Padding、Row 、Column 、Expanded 组件详解
Flutter中Stack层叠组件以及与Align、Positioned组件实现定位布局
1. Stack 组件 Stack 表示堆的意思,用此组件修饰的子组件会“堆”在一起。 常见属性: 1. alignment 对齐方式。值的类型为Alignment; 2. children 子组件。值的类型为Widget; 代码示例: import 'package:flutter/material.dart'; void main(){ runApp(MyApp()); } // 抽离成一个单独的组件 class MyApp extends StatelessWidget{ @ov
越陌度阡
2020/12/22
1.2K0
Flutter中Stack层叠组件以及与Align、Positioned组件实现定位布局
[Flutter Widget]Tooltip
在前面的文章中我们讲到了Wrap的用法,介绍了Flutter中的流式布局,在文章的最后让大家实现如下效果:
flyou
2018/10/16
3.3K0
Flutter Stack、Positioned 层叠布局
Flutter中的Stack,相当于Android里的FrameLayout和RelativeLayout。
毛大姑娘
2020/09/10
2K0
Flutter Stack、Positioned 层叠布局
深入理解 Flutter 鸿蒙版的 Stack 布局:适配屏幕与层叠样式布局
在 Flutter 中,布局是构建用户界面的基础。今天,我们将重点探讨 Flutter 的 Stack 布局,了解如何使用它创建复杂的界面元素,并实现响应式设计,以适应不同屏幕大小的设备。
淼学派对
2024/11/04
3260
Web转Native?探究Flutter和传统浏览器布局原理的异同。
大家都知道小程序的逻辑层和视图层是分离的,视图层不执行业务逻辑,只负责呈现结果,所以很适合做这样的改造尝试。我们选用的Native框架是Flutter,它可以在安卓ios双端跨平台运行。
WendyGrandOrder
2020/06/19
2K2
Web转Native?探究Flutter和传统浏览器布局原理的异同。
Flutter 中 image 图片组件
1. alignment 对齐方式 。值为Alignment类型,如:Alignment.topCenter;
越陌度阡
2020/12/18
1.7K0
Flutter 中 image 图片组件
『Flutter』布局组件 Container、Row、Column、Stack
经过上一Flutter 入门必学 MaterialApp 与 Scaffold 核心组件实战篇文章,开发出来了第二个 Flutter 程序,接下来是给大家详细的介绍下 Flutter 的布局组件。
程序员NEO
2025/03/07
5510
『Flutter』布局组件 Container、Row、Column、Stack
《Flutter》-- 4.Flutter组件基础
Flutter开发中有一个非常重要的理念,即一切皆为组件。Flutter中Widget不仅可以表示UI元素,也可以布局元素、动画、装饰效果。
爱学习的程序媛
2022/04/07
13.3K0
《Flutter》-- 4.Flutter组件基础
Flutter Lesson 4: Flutter组件之App布局组件
首先来看一下我怎么来学习Flutter,我要了解每一个组件,同时,这又是一个App,所以,我的目标是直接生产一个App,里面就是对Flutter组件的介绍,同时写上一些demo以及源代码,这一个点子源于React Native With Code这一款App,在我学习React Native的时候给予了我很大的帮助。如果要构建这样的一款App,我需要先构建一个App首页,包含了一个可以滚动的列表,如果可以,还可以添加一些其他的组件。以及基础的布局组件。
踏浪
2019/07/31
1.9K0
Flutter Lesson 4: Flutter组件之App布局组件
5.Flutter学习之GridView组件
学习自: Dart Flutter教程_Dart Flutter入门实战视频教程-2019年新出.
易帜
2022/02/09
4270
5.Flutter学习之GridView组件
轻松 Flutter 入门,秒变大前端
本文作者:dickma,腾讯 IEG 前端开发工程师 本文不是Flutter的教程,只是对 Flutter 的技术特性,做了一些略全面的入门级的介绍,如果你听说过Flutter,想去了解他,但是又不想去翻厚厚的API,那么本文就是为你准备的。 随着纯客户端到Hybrid技术,到RN&Weex,再到如今的Flutter技术,客户端实现技术不断前进。在之前的一个APP项目中,因为历史原因当时选择了weex,随着使用的不断深入,我们逐渐发现了weex的渲染性能问题已经成为一个隐患和瓶颈。随着Flutter技
腾讯技术工程官方号
2019/11/08
4.4K1
轻松 Flutter 入门,秒变大前端
《Flutter》-- 7.事件处理
一个完整的原始指针事件主要由手指按下、手指移动、手指抬起以及触摸取消构成,更高基本的手势都基于这些原始事件。
爱学习的程序媛
2022/04/07
2K0
《Flutter》-- 7.事件处理
Flutter系列之Flex布局详解
Flutter 是 Google 推出的跨平台 UI 框架,可以快速地在 Android 和 IOS 上构建高质量的应用程序,其主要特点是 Flutter 具有快速开发的能力、富有表现力和灵活的 Ui 以及良好的原生性能,本篇文章主要介绍 Flutter 中的 Flex 布局,如下:
用户9239674
2022/02/11
1.7K0
相关推荐
Flutter跨平台移动端开发丨Column、Row、Flex、Wrap、Flow、Stack
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验