前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Flutter Stack、Positioned 层叠布局

Flutter Stack、Positioned 层叠布局

作者头像
毛大姑娘
发布于 2020-09-10 07:53:01
发布于 2020-09-10 07:53:01
1.9K00
代码可运行
举报
文章被收录于专栏:向全栈出发向全栈出发
运行总次数:0
代码可运行

Flutter中的Stack,相当于Android里的FrameLayout和RelativeLayout。

层叠布局和Web中的绝对定位、Android中的Frame布局是相似的,子组件可以根据距父容器四个角的位置来确定自身的位置。绝对定位允许子组件堆叠起来(按照代码中声明的顺序)。

Flutter中使用StackPositioned这两个组件来配合实现绝对定位。Stack允许子组件堆叠,而Positioned用于根据Stack的四个角来确定子组件的位置。

1、Stack

Stack常用属性值

含义

alignment

指定未定位或部分定位widget的对齐方式

textDirection

用于确定alignment对齐的参考系

fit

此参数用于确定没有定位的子组件如何去适应Stack的大小

overflow

此属性决定如何显示超出Stack显示空间的子组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Stack({
  this.alignment = AlignmentDirectional.topStart,
  this.textDirection,
  this.fit = StackFit.loose,
  this.overflow = Overflow.clip,
  List<Widget> children = const <Widget>[],
})
  • alignment

此参数决定如何去对齐没有定位(没有使用Positioned)或部分定位的子组件。所谓部分定位,在这里特指没有在某一个轴上定位:leftright为横轴,topbottom为纵轴,只要包含某个轴上的一个定位属性就算在该轴上有定位。

  • textDirection

RowWraptextDirection功能一样,都用于确定alignment对齐的参考系,即:textDirection的值为TextDirection.ltr,则alignmentstart代表左,end代表右,即从左往右的顺序;textDirection的值为TextDirection.rtl,则alignment的start代表右,end代表左,即从右往左的顺序。

  • fit

此参数用于确定没有定位的子组件如何去适应Stack的大小。StackFit.loose表示使用子组件的大小,StackFit.expand表示扩伸到Stack的大小。

  • overflow

此属性决定如何显示超出Stack显示空间的子组件;值为Overflow.clip时,超出部分会被剪裁(隐藏),值为Overflow.visible 时则不会。

2、Positioned

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const Positioned({
  Key key,
  this.left, 
  this.top,
  this.right,
  this.bottom,
  this.width,
  this.height,
  @required Widget child,
})

lefttop 、right、 bottom分别代表离Stack左、上、右、底四边的距离。 widthheight用于指定需要定位元素的宽度和高度。

注意,Positionedwidthheight 和其它地方的意义稍微有点区别,此处用于配合lefttop 、right、 bottom来定位组件。

举个例子,在水平方向时,你只能指定leftrightwidth三个属性中的两个,如指定leftwidth后,right会自动算出(left+width),如果同时指定三个属性则会报错,垂直方向同理。

3、示例

在下面的例子中,我们通过对几个Text组件的定位来演示StackPositioned的特性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';
class StackDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new Scaffold(
        appBar: new AppBar(
          title: new Text("层叠布局"),
        ),
        //通过ConstrainedBox来确保Stack占满屏幕
        body: ConstrainedBox(
          constraints: BoxConstraints.expand(),
          child: Stack(
            alignment: Alignment.center,
            //指定未定位或部分定位widget的对齐方式
            textDirection: TextDirection.rtl,
            fit: StackFit.loose,
            overflow: Overflow.clip,
            children: <Widget>[
              Container(
                child:
                    Text("Hello world", style: TextStyle(color: Colors.white)),
                color: Colors.red,
              ),
              Positioned(
                left: 18.0,
                child: Text("left"),
              ),
              Positioned(
                top: 18.0,
                child: Text("top"),
              ),
              Positioned(
                right: 18.0,
                child: Text("right"),
              ),
              Positioned(
                bottom: 18.0,
                child: Text("bottom"),
              )
            ],
          ),
        ));
  }
}

void main() {
  runApp(new MaterialApp(
    title: "层叠布局案例",
    theme: new ThemeData(primaryColor: Colors.deepOrangeAccent),
    home: new StackDemo(),
  ));
}

效果图:

由于第一个子文本组件Text("Hello world")没有指定定位,并且alignment值为Alignment.center,所以它会居中显示。第二个子文本组件Text("left")只指定了水平方向的定位(left),所以属于部分定位,即垂直方向上没有定位,那么它在垂直方向的对齐方式则会按照alignment指定的对齐方式对齐,即垂直方向居中。

同理,其他Text与第二个Text原理一样。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年08月16日,如有侵权请联系 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
【Flutter 组件集录】Stack | 8 月更文挑战
Stack 是一个经常被用到的组件,我看可以通过它来叠合若干个组件。源码中对它的介绍是:
张风捷特烈
2022/03/18
5230
【Flutter 组件集录】Stack | 8 月更文挑战
Flutter布局基础——Stack层叠布局
Stack Widget的子视图要么是positioned,要么是non-positioned。Positioned子视图是指使用Positioned的widget包括起来的子视图,通过设置相对于Stack的top、bottom、left、right属性来确认自身位置,其中至少要有一个不为空。
莫空9081
2021/07/27
3.2K0
Flutter | 布局组件
布局类组件都会包含一个或多个组件,不同的布局类组件对子组件(layout)方式不同。在 Flutter 中 Element 树才是最终的绘制树,Element 树是通过 Widget 树来创建的 (通 Widget.createElement()) ,Widget 其实就是 Element 的配置数据。
345
2022/02/11
2.8K0
Flutter | 布局组件
Flutter 相对布局之Stack
相对布局,类似于android中的RelativeLayout、FrameLayout。 既可以相对父容器确定自己的位置,也可以多个widget重叠显示。 Stack与Positioned搭配使用。
yechaoa
2022/06/10
8100
Flutter 相对布局之Stack
flutter系列之:flutter中常用的Stack layout详解
对于现代APP的应用来说,为了更加美观,通常会需要用到不同图像的堆叠效果,比如在一个APP用户背景头像上面添加一个按钮,表示可以修改用户信息等。
程序那些事
2022/09/20
7030
Flutter Stack 组件
alignment : 指的是子Widget的对其方式,默认情况是以左上角为开始点 。
赵哥窟
2019/09/25
1K0
Flutter Stack 组件
『Flutter』布局组件 Container、Row、Column、Stack
经过上一Flutter 入门必学 MaterialApp 与 Scaffold 核心组件实战篇文章,开发出来了第二个 Flutter 程序,接下来是给大家详细的介绍下 Flutter 的布局组件。
程序员NEO
2025/03/07
2250
『Flutter』布局组件 Container、Row、Column、Stack
一篇带你看懂Flutter叠加组件Stack
Stack未定位的子组件大小由fit参数决定,默认值是StackFit.loose,表示子组件自己决定,StackFit.expand表示尽可能的大,用法如下:
老孟Flutter
2020/09/11
9310
一篇带你看懂Flutter叠加组件Stack
Stack未定位的子组件大小由fit参数决定,默认值是StackFit.loose,表示子组件自己决定,StackFit.expand表示尽可能的大,用法如下:
老孟Flutter
2020/03/06
7710
Flutter开发-布局类组件
不要在 Flex widget 里放置 unbounded constraints
码客说
2020/05/14
1.1K0
Flutter开发-布局类组件
【Flutter实战】六大布局组件
老孟导读:Flutter中布局组件有水平 / 垂直布局组件( Row 和 Column )、叠加布局组件( Stack 和 IndexedStack )、流式布局组件( Wrap )和 自定义布局组件(Flow)。
老孟Flutter
2020/09/11
2K0
【Flutter实战】六大布局组件
《Flutter》-- 5.Flutter页面布局
盒约束是指组件可以按照指定限制条件来决定如何布局自身位置。Flutter提供的尺寸限制类容器可以用于限制容器的大小,并提供了多种约束容器组件,常见的有ConstrainedBox、SizedBox和UnconstrainedBox。
爱学习的程序媛
2022/04/07
1K0
《Flutter》-- 5.Flutter页面布局
『Flutter』布局组件 Container、Row、Column、Stack
经过上一篇文章,开发出来了第二个 Flutter 程序,接下来是给大家详细的介绍下 Flutter 的布局组件。
杨不易呀
2024/01/15
1.8K0
『Flutter』布局组件 Container、Row、Column、Stack
深入理解 Flutter 鸿蒙版的 Stack 布局:适配屏幕与层叠样式布局
在 Flutter 中,布局是构建用户界面的基础。今天,我们将重点探讨 Flutter 的 Stack 布局,了解如何使用它创建复杂的界面元素,并实现响应式设计,以适应不同屏幕大小的设备。
淼学派对
2024/11/04
1920
【Flutter】Flutter 布局组件 ( FractionallySizedBox 组件 | Stack 布局组件 | Positioned 组件 )
FractionallySizedBox 组件 : 可控制组件在水平/垂直方向上填充满父容器 ;
韩曙亮
2023/03/28
2.9K0
【Flutter】Flutter 布局组件 ( FractionallySizedBox 组件 | Stack 布局组件 | Positioned 组件 )
7.Flutter学习之Stack层叠组件、Stack与Align Stack 与Positioned实现 RelativeLayout
笔录Flutter(五)布局系列:Stack层叠组件、Stack与Align Stack 与Positioned实现 RelativeLayout 相比学习过Android的同学们应该都清楚什么是RelativeLayout。这里就不进行解释了。直接看内容吧。
易帜
2022/02/09
4790
7.Flutter学习之Stack层叠组件、Stack与Align Stack 与Positioned实现 RelativeLayout
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.1K0
Flutter中Stack层叠组件以及与Align、Positioned组件实现定位布局
Flutter 布局篇 Positioned 和 Container
它是由众多容器类Widget(DecoratedBox、ConstrainedBox、Transform、Padding、Align等)组合成的Widget,所以它的功能可以说集众家之特性
猿哥
2019/03/13
3.4K0
Flutter常用widget “Stack”
顾名思义:栈布局,有的文章说是像安卓里面的线性布局,不过这里我觉得更像帧布局吧。 构造方法:
坑吭吭
2018/08/31
6310
相关推荐
Flutter跨平台移动端开发丨Column、Row、Flex、Wrap、Flow、Stack
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验