Flutter 中的绝对定位 Stack、Align、Positioned

2023-12-18 14:58

本文主要是介绍Flutter 中的绝对定位 Stack、Align、Positioned,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 一、Stack Widget 和 Align Widget 实现绝对定位
    • 1、Stack Widget
    • 2、Align Widget
    • 3、Stack + Align 实现的绝对定位
  • 二、Positioned Widget
  • 三、完整代码
    • 1、Stack + Aligment
    • 2、Stack + Positioned

 

一、Stack Widget 和 Align Widget 实现绝对定位

1、Stack Widget

HTML 中实现绝对定位使用的 absolute 属性,native 中所有的一切都是绝对定位

在 Flutter 中封装了非常方便的 Widget 来进行绝对定位

Stack Widget 是定位发生的容器,只有在 Stack 中,绝对定位的 Widget 才会生效

Stack 的构造方法非常简单:

  /// Creates a stack layout widget.////// By default, the non-positioned children of the stack are aligned by their/// top left corners.Stack({Key key,this.alignment = AlignmentDirectional.topStart,this.textDirection,this.fit = StackFit.loose,this.overflow = Overflow.clip,List<Widget> children = const <Widget>[],}) : super(key: key, children: children);

其中关键的属性就是 children,除了几个样式控制的参数之外,通过 children 可以传入一个 Widget 列表,用于表用在 Stack 中进行绝对定位的 Widget

2、Align Widget

Align 是一个 具有 Alignment 属性的 Widget,基础的属性就是 alignment,并且默认值是 Aligment.center

构造函数如下:

  const Align({Key key,this.alignment = Alignment.center,this.widthFactor,this.heightFactor,Widget child,}) : assert(alignment != null),assert(widthFactor == null || widthFactor >= 0.0),assert(heightFactor == null || heightFactor >= 0.0),super(key: key, child: child);

除了可以指定 aligment 之外,还可以传入一个 Widget 作为 子 widget

3、Stack + Align 实现的绝对定位

从 Align 的构造可以看出,通过 Stack + Align 实现的绝对定位可选择的位置是比较少的

        Stack(children: <Widget>[Align(child: Icon(Icons.home, size: 40, color: Colors.white),alignment: Alignment.topCenter,),Align(child: Icon(Icons.search, size: 40, color: Colors.pink),alignment: Alignment.bottomLeft,),Icon(Icons.settings, size: 40, color: Colors.blue),Icon(Icons.arrow_drop_down, size: 40, color: Colors.red),],alignment: Alignment.center,)

上面代码中,前两个 Widget 我是使用的 Align Widget,并且分别指定了 aligment 的属性时 topCenter 和 bottomLeft

而下面的两个 Icon,则是普通的 Widget,没有使用 Aligment

最终效果:

32666-f8f2yww8zk.png

可以发现,如果在 Stack 中不指定 Align 这种 Widget,最终的都会在 Stack 指定的 aligment 属性位置布局(示例中我设置了基于中间进行布局),而且会重叠在一起,这也和 absolute 的属性比较相似

二、Positioned Widget

相比于 Align Widget 布局的局限性(只能指定 Aligment 的几个属性),Positioned Widget 在绝对布局上更加 贴合 absolute 的方式

Positioned 提供了 left、top、right、bottom 四个属性来进行布局定位,构造方法如下:

  const Positioned({Key key,this.left,this.top,this.right,this.bottom,this.width,this.height,@required Widget child,}) : assert(left == null || right == null || width == null),assert(top == null || bottom == null || height == null),super(key: key, child: child);

Stack + Postioned 进行绝对定位布局的示例:

        Stack(children: <Widget>[Positioned(child: Icon(Icons.home, size: 40, color: Colors.white),left: 0,top: 0),Positioned(child: Icon(Icons.search, size: 40, color: Colors.pink),left: 0.4),Positioned(child: Icon(Icons.settings, size: 40, color: Colors.blue),bottom: 1),],alignment: Alignment.center,)

最终效果:

50871-2hwa5fz3p2g.png

上面的结果中,第一个图片 home 坐标是 top: 0, left:0

search 图标使用的是 left:0.4

settings 图标使用的是 bottom: 1

如果使用 bottom:1, left: 1 的图标的效果是:

Positioned(child: Icon(Icons.settings, size: 40, color: Colors.blue),bottom: 1, left: 1),

45169-qoyfsktugf.png

Positioned(child: Icon(Icons.settings, size: 40, color: Colors.blue),bottom: 1, right: 1),

12628-ajqs2s11pck.png

Positioned(child: Icon(Icons.settings, size: 40, color: Colors.blue),top: 0.5, right: 0.5),

18551-w901cjj1cgm.png

Positioned(child: Icon(Icons.settings, size: 40, color: Colors.blue),top: 0.5, right: 0.1),
Positioned(child: Icon(Icons.settings, size: 40, color: Colors.blue),top: 0),

08911-v6l0ecuzh8c.png

三、完整代码

1、Stack + Aligment

https://github.com/postbird/FlutterHelloWorldDemo/blob/master/demo1/lib/bak/main.19-Stack%20Align%20%E7%BB%84%E4%BB%B6.dart

2、Stack + Positioned

https://github.c

这篇关于Flutter 中的绝对定位 Stack、Align、Positioned的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/508814

相关文章

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte

css中的 vertical-align与line-height作用详解

《css中的vertical-align与line-height作用详解》:本文主要介绍了CSS中的`vertical-align`和`line-height`属性,包括它们的作用、适用元素、属性值、常见使用场景、常见问题及解决方案,详细内容请阅读本文,希望能对你有所帮助... 目录vertical-ali

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

浅析Python中的绝对导入与相对导入

《浅析Python中的绝对导入与相对导入》这篇文章主要为大家详细介绍了Python中的绝对导入与相对导入的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1 Imports快速介绍2 import语句的语法2.1 基本使用2.2 导入声明的样式3 绝对import和相对i

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

Flutter Button使用

Material 组件库中有多种按钮组件如ElevatedButton、TextButton、OutlineButton等,它们的父类是于ButtonStyleButton。         基本的按钮特点:         1.按下时都会有“水波文动画”。         2.onPressed属性设置点击回调,如果不提供该回调则按钮会处于禁用状态,禁用状态不响应用户点击。