Flutter实现绝对定位学习

        通过 Stack + Positioned实现Flutter绝对定位学习。

简单Demo

import 'package:flutter/material.dart';class MyPositionedDemoPage extends StatelessWidget {const MyPositionedDemoPage({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("MyPositionedDemoPage"),),body: Container(width: MediaQuery.sizeOf(context).width,height: MediaQuery.sizeOf(context).height,margin: const EdgeInsets.all(15),child: Stack(children: <Widget>[MaterialButton(onPressed: () {},color: Colors.grey,),Positioned(left: MediaQuery.sizeOf(context).width / 3,child: MaterialButton(onPressed: () {}, color: Colors.blue),),Positioned(left: MediaQuery.sizeOf(context).width / 4,top: MediaQuery.sizeOf(context).height / 5 * 3,child: MaterialButton(onPressed: () {},color: Colors.orange,),),Positioned(left: MediaQuery.sizeOf(context).width / 2 -Theme.of(context).buttonTheme.minWidth / 3,top: MediaQuery.sizeOf(context).height / 2 -MediaQuery.paddingOf(context).top -kToolbarHeight,child: MaterialButton(onPressed: () {},color: Colors.red,))],),),);}
}

       

代码解析

Positioned       

         在 Flutter 中,`Positioned` 是一个用于定位子组件的 widget,它通常在 `Stack` widget 中使用。通过 `Positioned`,你可以在父级 `Stack` 的边界内精确定位子组件,指定其相对于父级的四个边界的位置(`top`、`right`、`bottom`、`left`)。以下是对 `Positioned` 的详细解析:

 基本用法

        `Positioned` widget 需要与 `Stack` widget 一起使用,因为 `Stack` 提供了子组件可以相互重叠并相对于彼此进行定位的布局环境。

Stack(children: <Widget>[MaterialButton(onPressed: () {},color: Colors.grey,),Positioned(left: MediaQuery.sizeOf(context).width / 3,child: MaterialButton(onPressed: () {}, color: Colors.blue),),Positioned(left: MediaQuery.sizeOf(context).width / 4,top: MediaQuery.sizeOf(context).height / 5 * 3,child: MaterialButton(onPressed: () {},color: Colors.orange,),),Positioned(left: MediaQuery.sizeOf(context).width / 2 -Theme.of(context).buttonTheme.minWidth / 3,top: MediaQuery.sizeOf(context).height / 2 -MediaQuery.paddingOf(context).top -kToolbarHeight,child: MaterialButton(onPressed: () {},color: Colors.red,))],
)

`Positioned` 属性

  • `top`: 子组件距离 `Stack` 顶部的距离。
  • `right`: 子组件距离 `Stack` 右边的距离。
  • `bottom`: 子组件距离 `Stack` 底部的距离。
  • `left`: 子组件距离 `Stack` 左边的距离。
  • `width` 和 `height`: 直接设置子组件的宽度和高度。如果没有设置,子组件会按照其自身的尺寸进行布局。

如何使用

  1. 在 `Stack` 中定位:`Positioned` 必须是 `Stack` 的直接子组件,它通过指定相对于 `Stack` 边界的偏移值来定位自己。
  2. 支持多种组合:可以同时使用多个属性(如 `top` 和 `left`),也可以单独使用一个属性(如 `right`)来实现不同的定位效果。
  3. 灵活性:`Positioned` 提供了灵活的布局方式,可以在屏幕上精确控制子组件的位置,适合需要重叠和复杂布局的场景。
注意事项
  • 重叠顺序:在 `Stack` 中,后添加的 `Positioned` widget 会显示在前面。

Stack

        `Stack` 是 Flutter 中一个非常强大的布局 widget,它允许子组件相互重叠。通过 `Stack`,你可以创建复杂的、层叠的界面布局。以下是对 `Stack` widget 的详细解析:

`Stack` 的基本概念

  • 层叠布局:`Stack` 中的子组件是按顺序从底到顶叠加的。最早添加的组件位于底层,最后添加的组件位于顶层。
  • 定位子组件:通常使用 `Positioned` widget 来精确定位 `Stack` 中的子组件。

`Stack` 的主要属性

  • `alignment`:定义没有位置约束的子组件如何在 `Stack` 中对齐。默认为 `AlignmentDirectional.topStart`,即左上角。你可以使用 `Alignment` 类提供的常量(如 `Alignment.center`)来更改此行为。
  • `fit`:决定 `Stack` 如何调整其非定位子组件的大小。常用的值有:
  • `StackFit.loose`(默认):子组件根据自身大小布局。
  • `StackFit.expand`:子组件扩展以填充 `Stack`。
  • `StackFit.passthrough`:子组件尽可能大。
  • `clipBehavior`:定义 `Stack` 的裁剪行为。常用的值有 `Clip.none`(不裁剪)和 `Clip.hardEdge`(裁剪到 `Stack` 的边界)。

注意事项
  1. 子组件顺序:`Stack` 中子组件的顺序决定了它们的绘制顺序。后添加的组件会在前面绘制。
  2. 动态布局:`Stack` 适合用于需要相互重叠的布局场景,例如徽章、图像叠加文字等。
  3. 性能考虑:当 `Stack` 中有很多子组件时,可能会影响性能,特别是在复杂布局中。尽量优化子组件的数量和复杂度。
  4. 调试布局:使用 Flutter 提供的调试工具(如 `flutter inspector`)可以帮助你更好地理解 `Stack` 中子组件的布局和对齐方式。

通过 `Stack`,你可以灵活地创建复杂的 UI 布局,利用 `Positioned` 和对 `alignment` 的合理设置,可以实现高度自定义的界面布局。

以下是一些关于 `Stack` 的高级用法和技巧,它们可以帮助你更好地理解和利用 `Stack` 的特性:

高级用法和技巧

使用 `IndexedStack`:

  • `IndexedStack` 是 `Stack` 的一个变体,它一次只显示一个子组件。可以通过指定索引来控制哪个子组件可见。
  • 适用于需要在多个子组件之间切换显示的场景,例如分页或选项卡界面。
IndexedStack(index: 1,  // 显示第二个子组件children: <Widget>[Container(color: Colors.red),Container(color: Colors.green),Container(color: Colors.blue),],
)

动画和交互:

  • 使用 `AnimatedPositioned` 可以在 `Stack` 中实现平滑的子组件位置变化,适用于需要动画效果的场合。
  • 可以结合手势检测(如 `GestureDetector`)来实现交互式的布局调整。

混合不同布局:

  • 在 `Stack` 内部可以嵌套其他布局组件(如 `Column`、`Row`),以实现更复杂的布局结构。
  • 通过组合使用 `Positioned` 和 `Align` 可以实现子组件的精确定位和对齐。

响应式布局:

  • 利用 `MediaQuery` 或 `LayoutBuilder` 动态调整 `Stack` 的布局,以适应不同的屏幕尺寸和方向。
  • 创建自适应的 UI,确保在各种设备上都有良好的显示效果。

处理溢出问题:

  • 如果子组件超出 `Stack` 的边界,可以通过设置 `clipBehavior` 来控制裁剪行为。
  • 使用 `OverflowBox` 或 `SizedOverflowBox` 来处理可能的溢出布局需求。

调试和优化:

  • 使用 `Flutter Inspector` 工具可以可视化查看 `Stack` 中子组件的布局,帮助定位问题。
  • 通过减少不必要的重叠和复杂子组件,优化 `Stack` 的性能。

实践中的注意事项

  • 布局调试:当遇到布局问题时,可以使用 `Container` 的边框和颜色属性来帮助可视化布局边界。
  • 性能优化:尽量减少 `Stack` 中子组件的数量和复杂度,避免不必要的重叠和复杂布局。
  • 组合布局:`Stack` 可以与其他布局 widget(如 `Flexible`、`Expanded`)结合使用,以创建灵活且响应式的界面。

通过理解这些高级用法和技巧,你可以更灵活地使用 `Stack` 来实现复杂的 UI 布局。无论是用于简单的重叠布局还是复杂的交互式界面,`Stack` 都提供了强大的功能和灵活性。

MediaQuery

`MediaQuery` 是 Flutter 中用于获取设备屏幕信息的一个类,它可以帮助你根据设备的尺寸、方向、像素密度等来调整你的应用布局。`MediaQuery.sizeOf(context)` 是一种用法,它返回当前设备屏幕的尺寸。

基本概念
  • `MediaQuery`:提供当前设备屏幕的环境信息,包括尺寸、方向、缩放因子等。
  • `size`:返回一个 `Size` 对象,包含屏幕的宽度(`width`)和高度(`height`)。

使用场景

`MediaQuery` 的 `size` 属性通常用于创建响应式布局,使得应用程序能够在不同设备和屏幕尺寸上保持良好的显示效果。

注意事项
  1. 上下文正确性:确保在 widget 树中适当的位置使用 `MediaQuery.of(context)`。在 `build` 方法中使用它是最常见的方式。
  2. 响应式设计:利用 `MediaQuery` 提供的信息,可以根据屏幕尺寸动态调整布局和样式。例如,使用不同的字体大小、边距以及组件尺寸。
  3. 设备旋转:`MediaQuery` 会自动适应设备的方向变化(如从竖屏到横屏),这使得布局调整更加灵活。
  4. 与其他工具结合:`MediaQuery` 可以与 `LayoutBuilder` 和 `OrientationBuilder` 结合使用,以实现更复杂的响应式布局。

通过 `MediaQuery.of(context).size`,你可以轻松获取屏幕尺寸信息,从而为各种屏幕尺寸和方向提供优化的用户体验。这是 Flutter 开发中实现响应式设计的一个重要工具。

Theme.of(context).buttonTheme.minWidth

在 Flutter 中,`Theme.of(context)` 提供了访问当前主题(`ThemeData`)的能力,`ThemeData` 定义了应用的主题相关属性,包括颜色、字体、按钮样式等。`Theme.of(context).buttonTheme` 返回一个 `ButtonThemeData` 对象,该对象包含与按钮相关的主题配置。

基本概念
  • `Theme.of(context)`:用于获取当前的主题数据(`ThemeData`),这是 Flutter 中实现应用外观一致性的核心方式。
  • `buttonTheme`:`ThemeData` 中的一个属性,返回 `ButtonThemeData`,包含按钮的全局配置,如按钮的最小宽度、高度、形状、布局行为等。
  • `minWidth`:`ButtonThemeData` 的一个属性,指定按钮的最小宽度。默认情况下,Flutter 中的按钮会至少扩展到这个宽度。如果按钮内容(如文本)需要更大的空间,按钮将根据内容自动调整大小。
使用场景

`buttonTheme.minWidth` 通常用于统一应用中按钮的最小宽度,确保按钮在不同屏幕和上下文中看起来一致。

注意事项
  1. 默认值和覆盖:如果没有明确设置 `minWidth`,则使用 Flutter 的默认值。你可以在特定的按钮上使用 `ButtonStyle` 来覆盖全局设置。
  2. 响应式设计:在不同的屏幕尺寸上,确保 `minWidth` 合理设置以避免按钮看起来过大或过小。
  3. 主题一致性:使用 `Theme` 可以确保应用中组件的一致性,但在某些情况下,可能需要为特定的组件设置不同的样式。

通过理解 `buttonTheme.minWidth`,你可以更好地控制按钮的布局和外观,为用户提供一致而美观的界面体验。这是主题定制化的一部分,使得应用可以适应品牌需求或设计规范。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/471956.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Probing the 3D Awareness of Visual Foundation Models》论文解析——多视图一致性

一、论文简介 论文讨论了大规模预训练产生的视觉基础模型在处理任意图像时的强大能力&#xff0c;这些模型不仅能够完成训练任务&#xff0c;其中间表示还对其他视觉任务&#xff08;如检测和分割&#xff09;有用。研究者们提出了一个问题&#xff1a;这些模型是否能够表示物体…

【C++】深入理解自定义 list 容器中的 list_iterator:迭代器实现详解

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 &#x1f4cc; 引言&#x1f4cc; 1. 为什么 list 容器需要 list_iterator…

昆明华厦眼科医院举办中外专家眼科技术研讨会

9月13日&#xff0c;“睿智迭代&#xff0c;增效赋能”Menicon Z Night中外专家研讨会在昆明华厦眼科医院成功举办。此次会议由目立康公司与昆明华厦眼科医院携手共筑&#xff0c;标志着双方合作迈向新的高度。 昆明华厦眼科医院总经理王若镜首先发表了热情洋溢的致辞&#xff…

FreeRTOS的列表与列表项

目录 1.为什么要学列表&#xff1f; 2.什么是列表和列表项&#xff1f; 2.1 列表 2.2列表项 2.3&#xff0c;迷你列表项 3.列表与列表项的初始化 3.1 列表初始化 3.2列表项初始化 4.列表项的“增删查”&#xff08;插入、删除、遍历&#xff09; 4.1列表项的插入 4.1.1…

前端(3)——快速入门JaveScript

参考&#xff1a; 罗大富 JavaScript 教程 | 菜鸟教程 JavaScript 教程 1. JaveScript JavaScript 简称 JS JavaScript 是一种轻量级、解释型、面向对象的脚本语言。它主要被设计用于在网页上实现动态效果&#xff0c;增加用户与网页的交互性。作为一种客户端脚本语言&#…

使用阿里云快速搭建 DataLight 平台

使用阿里云快速搭建 DataLight 平台 本篇文章由用户 “闫哥大数据” 分享&#xff0c;B 站账号&#xff1a;https://space.bilibili.com/357944741?spm_id_from333.999.0.0 注意&#xff1a;因每个人操作顺序可能略有区别&#xff0c;整个部署流程如果出现出入&#xff0c;以…

H.265流媒体播放器EasyPlayer.js H.264/H.265播放器chrome无法访问更私有的地址是什么原因

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、MP3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方…

QT_CONFIG宏使用

时常在Qt代码中看到QT_CONFIG宏&#xff0c;之前以为和#define、DEFINES 差不多&#xff0c;看了定义才发现不是那么回事&#xff0c;定义如下&#xff1a; 看注释就知道了QT_CONFIG宏&#xff0c;其实是&#xff1a;实现了一个在编译时期安全检查&#xff0c;检查指定的Qt特性…

centos7安装Chrome使用selenium-wire

背景&#xff1a;在centos7中运行selenium-wire爬虫&#xff0c;系统自带的Firefox浏览器不兼容&#xff0c;运行报错no attribute ‘set_preference’&#xff0c;应该是selenium-wire和Firefox的驱动不兼容 查了半天不知道怎么解决&#xff0c;就想在centos7上安装Chrome来跑…

医院信息化与智能化系统(21)

医院信息化与智能化系统(21) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应…

《FreeRTOS任务控制块篇》

Task control block, 即任务控制块。任务控制块&#xff08;TCB&#xff09;是一个结构体&#xff0c;它会分配给每个任务&#xff0c;其中存储着任务的状态信息&#xff0c;包括指向任务上下文&#xff08;任务的运行时环境&#xff0c;包括寄存器值&#xff09;的指针。任务控…

Queuing 表(buffer表)的优化实践 | OceanBase 性能优化实践

案例问题描述 该案例来自一个金融行业客户的问题&#xff1a;他们发现某个应用对一个数据量相对较小的表&#xff08;仅包含数千条记录&#xff09;访问时&#xff0c;频繁遇到性能下降的情况。为解决此问题&#xff0c;客户向我们求助进行分析。我们发现这张表有频繁的批量插…

ssh登陆服务器后支持Tab键命令补全

在服务器上新建了用户后&#xff0c;通过ssh登录到服务器后发现不能使用Tab键来进行命令补全 截图如下&#xff1a; 以为没有配置.bashrc 此时输入 source 发现无此命令 细心的可以发现 -sh 于是输入命令echo $SHELL 确认此时的shell为sh&#xff0c; 只要输入命令bash即可切…

[白月黑羽]关于仿写类postman功能软件题目的解答

原题&#xff1a; 答&#xff1a; python文件如下 from PySide6.QtWidgets import QApplication, QMessageBox,QTableWidgetItem,QHeaderView,QWidget,QTableWidget from PySide6.QtCore import QEvent,QObject from PySide6.QtUiTools import QUiLoader import time import …

Postman接口测试(断言、关联、参数化、输出测试报告)

基本界面展示 Get、Post请求 Postman断言 使用postman来判断预期结果与实际结果是否一致 响应状态码断言 响应包含字符串 断言判断字符串的格式 关联 用于解决http请求之间存在依赖关系 依赖&#xff1a;一个http请求的响应结果中的数据&#xff0c;被另一个请求使用 登…

【卡尔曼滤波】数据融合Fusion的应用 C语言、Python实现(Kalman Filter)

【卡尔曼滤波】数据融合Fusion的应用 C语言、Python实现&#xff08;Kalman Filter&#xff09; 更新以gitee为准&#xff1a; gitee地址 文章目录 卡尔曼滤波数据融合Python实现C语言实现多个数据如何融合附录&#xff1a;压缩字符串、大小端格式转换压缩字符串浮点数压缩Pac…

网络原理-网络层和数据链路层

一、网络层 1、IP协议完成的工作 地址管理&#xff1a;使用一套地址体系来描述所没备的位置 路由选择&#xff1a;一个数据包如何从网络的某个地址传到另一个地址 2、IP报头 4 位版本号&#xff1a;取值为4或6 (IPv4/IPv6) 4 位首部长度&#xff1a;IP报头&#xff0c;单位…

【Three.js基础学习】22.New project structure

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 这里将使用全新的项目结构&#xff0c;将不同工具分层&#xff0c;区分开使用。 一、结构目录 二、对应文件 1.script.js 获取画布&#xff0c;引入样式和功能。 /* 课…

AI风向标|算力与通信的完美融合,SRM6690解锁端侧AI的智能密码

当前&#xff0c;5G技术已经成为推动数字经济和实体经济深度融合的关键驱动力&#xff0c;进入5G发展的下半场&#xff0c;5G与AI的融合正推动诸多行业的数字化转型和创新发展&#xff0c;终端侧AI和端云混合式AI将广泛应用于各类消费终端和各行各业。 在推动5G和AI与各行业场…

【WPF】Prism学习(二)

Prism Commands 1.命令&#xff08;Commanding&#xff09; 1.1. ViewModel的作用&#xff1a; ViewModel不仅提供在视图中显示或编辑的数据&#xff0c;还可能定义一个或多个用户可以执行的动作或操作。这些用户可以通过用户界面&#xff08;UI&#xff09;执行的动作或操作…