Flutter(三):Stack、Positioned、屏幕相关尺寸、Navigator路由跳转

页面尺寸

在这里插入图片描述

  • 通知栏高度:MediaQuery.of(context).padding.top
  • 顶部导航高度:kToolbarHeight
  • 底部导航高度:kBottomNavigationBarHeight
  • 屏幕宽:MediaQuery.of(context).size.width
  • 屏幕高:MediaQuery.of(context).size.height
import 'package:flutter/material.dart';// 描述文本
class DescText extends StatelessWidget {final String title;final double size;const DescText(this.title, {super.key, this.size = 10});Widget build(BuildContext context) {return Center(child: Text(title, style: TextStyle(fontSize: size, decoration: TextDecoration.none)),);}
}class ScreenSizePage extends StatefulWidget {const ScreenSizePage({super.key});State<ScreenSizePage> createState() => _ScreenSizePage();
}class _ScreenSizePage extends State<ScreenSizePage> {Widget build(BuildContext context) {// 屏幕宽度double screenWidth = MediaQuery.of(context).size.width;// 屏幕高度double screenHeight = MediaQuery.of(context).size.height;// 通知栏高度double noticeHeight = MediaQuery.of(context).padding.top;// 屏幕中心double centerX = screenWidth / 2;double centerY = screenHeight / 2;return Container(width: double.infinity,height: double.infinity,color: Colors.grey,child: Stack(children: [Positioned(top: 0,left: 0,child: Container(width: screenWidth,height: noticeHeight,color: Colors.yellow,child: DescText('通知栏高度($noticeHeight):MediaQuery.of(context).padding.top'),),),Positioned(top: noticeHeight,left: 0,child: Container(width: screenWidth,height: kToolbarHeight,color: Colors.blue,child: const DescText('顶部导航高度($kToolbarHeight):kToolbarHeight', size: 16),),),Positioned(bottom: 0,left: 0,child: Container(width: screenWidth,height: kBottomNavigationBarHeight,color: Colors.green,child: const DescText('底部导航高度($kBottomNavigationBarHeight):kBottomNavigationBarHeight', size: 14),),),Positioned(bottom: 80,left: 0,child: Container(width: screenWidth,height: 30,color: const Color.fromRGBO(255, 255, 0, .3),child: DescText('屏幕宽($screenWidth):MediaQuery.of(context).size.width'),),),Positioned(top: 0,right: 80,child: Container(width: 30,height: screenHeight,color: const Color.fromRGBO(0, 255, 255, .3),child: RotatedBox(quarterTurns: 45,child: DescText('屏幕高($screenHeight):MediaQuery.of(context).size.height', size: 12),),),),Positioned(top: centerY - 18,left: centerX - 50,child: MaterialButton(onPressed: () => Navigator.pop(context, true),// 返回上一页color: Colors.white,textColor: Colors.blue,minWidth: 100,height: 36,child: const Text('返 回'),),),],),);}
}

Stack布局

SelectWidget组件参考 https://blog.csdn.net/weixin_43526371/article/details/136256386

在这里插入图片描述

import 'package:flutter/material.dart';
import 'package:flutter_app/components/select_widget.dart';class StackPage extends StatefulWidget {const StackPage({super.key});State<StackPage> createState() => _StackPage();
}class _StackPage extends State<StackPage> {AlignmentDirectional alignmentValue = AlignmentDirectional.topStart;List<SelectOption> alignmentList = [SelectOption(label: 'topStart', value: AlignmentDirectional.topStart),SelectOption(label: 'topCenter', value: AlignmentDirectional.topCenter),SelectOption(label: 'topEnd', value: AlignmentDirectional.topEnd),SelectOption(label: 'centerStart', value: AlignmentDirectional.centerStart),SelectOption(label: 'center', value: AlignmentDirectional.center),SelectOption(label: 'centerEnd', value: AlignmentDirectional.centerEnd),SelectOption(label: 'bottomStart', value: AlignmentDirectional.bottomStart),SelectOption(label: 'bottomCenter', value: AlignmentDirectional.bottomCenter),SelectOption(label: 'bottomEnd', value: AlignmentDirectional.bottomEnd),];TextDirection textDirectionValue = TextDirection.ltr;List<SelectOption> textDirectionList = [SelectOption(label: 'ltr', value: TextDirection.ltr),SelectOption(label: 'rtl', value: TextDirection.rtl),];Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('Stack 布局')),body: Scaffold(appBar: PreferredSize(preferredSize: const Size.fromHeight(50),child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween,children: [Expanded(flex: 1,child: SelectWidget(title: 'AlignmentDirectional',options: alignmentList,onChange: (SelectOption selectOption) {setState(() {alignmentValue = selectOption.value as AlignmentDirectional;});},),),Expanded(flex: 1,child: SelectWidget(title: 'TextDirection',options: textDirectionList,onChange: (SelectOption selectOption) {setState(() {textDirectionValue = selectOption.value as TextDirection;});},),),],),),body: Container(width: double.infinity,height: double.infinity,color: Colors.grey,child: Stack(alignment: alignmentValue,textDirection: textDirectionValue,children: [Container(width: 250, height: 250, color: Colors.red),Container(width: 200, height: 200, color: Colors.green),Container(width: 150, height: 150, color: Colors.blue),Container(width: 100, height: 100, color: Colors.black),],),),),);}
}

Positioned布局

在这里插入图片描述

import 'package:flutter/material.dart';class PositionedPage extends StatefulWidget {const PositionedPage({super.key});State<PositionedPage> createState() => _PositionedPage();
}class _PositionedPage extends State<PositionedPage> {Widget build(BuildContext context) {// 屏幕宽度double screenWidth = MediaQuery.of(context).size.width;// 屏幕高度double screenHeight = MediaQuery.of(context).size.height;// 通知栏高度double noticeHeight = MediaQuery.of(context).padding.top;// 屏幕中心double centerX = screenWidth / 2;double centerY = (screenHeight - noticeHeight - kToolbarHeight - kBottomNavigationBarHeight) /2;return Scaffold(appBar: AppBar(title: const Text('Positioned 布局')),body: Container(width: double.infinity,height: double.infinity,color: Colors.grey,child: Stack(children: [// 中Positioned(top: centerY - 50,left: centerX - 50,child: Container(width: 100, height: 100, color: Colors.orange),),// 左上Positioned(top: 10,left: 10,child: Container(width: 120,height: 120,color: Colors.red,child: Stack(children: [Positioned(top: 20,left: 20,child: Container(width: 50, height: 50, color: Colors.black)),],),),),// 右上Positioned(top: 10,right: 10,child: Container(width: 120,height: 120,color: Colors.green,child: Stack(children: [Positioned(top: 20,right: 20,child: Container(width: 50, height: 50, color: Colors.blue)),],),),),// 左下Positioned(bottom: 10,left: 10,child: Container(width: 120,height: 120,color: Colors.blue,child: Stack(children: [Positioned(bottom: 20,left: 20,child: Container(width: 50, height: 50, color: Colors.green)),],),),),// 右下Positioned(bottom: 10,right: 10,child: Container(width: 120,height: 120,color: Colors.black,child: Stack(children: [Positioned(bottom: 20,right: 20,child: Container(width: 50, height: 50, color: Colors.red)),],),),),],),),bottomNavigationBar: BottomNavigationBar(items: const [BottomNavigationBarItem(icon: Icon(Icons.home), label: 'HOME'),BottomNavigationBarItem(icon: Icon(Icons.book), label: 'BOOK'),],),);}
}

路由组件

在这里插入图片描述

路由组件

import 'package:flutter/material.dart';
import 'package:flutter_app/views/RowColumnPage.dart';
import 'package:flutter_app/views/StackPage.dart';
import 'package:flutter_app/views/ScreenSizePage.dart';
import 'package:flutter_app/views/PositionedPage.dart';class MenuItem {final String title;final Widget widget;MenuItem({required this.title, required this.widget});
}class RouterWidget extends StatelessWidget {const RouterWidget({super.key});static List<MenuItem> list = <MenuItem>[MenuItem(title: "Row、Column 布局", widget: const RowColumnPage()),MenuItem(title: "Stack 布局", widget: const StackPage()),MenuItem(title: "界面尺寸", widget: const ScreenSizePage()),MenuItem(title: "Positioned 布局", widget: const PositionedPage()),];Widget build(BuildContext context) {return ListView.separated(itemCount: list.length,separatorBuilder: (BuildContext context, int index) => const Divider(height: 1),itemBuilder: (BuildContext context, int index) {return ListTile(title: Text(list[index].title),onTap: () {Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => list[index].widget));},);},);}
}

入口组件

import 'package:flutter/material.dart';
import 'package:flutter_app/components/router_widget.dart';void main() {runApp(const App());
}class App extends StatefulWidget {const App({super.key});State<App> createState() => _AppState();
}class _AppState extends State<App> {Widget build(BuildContext context) {return MaterialApp(debugShowCheckedModeBanner: false, // 移除右上角DEBUG标识home: Scaffold(appBar: AppBar(title: const Text("目录")),body: const RouterWidget(),),);}
}

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

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

相关文章

【计算机】本科考研还是就业?

其实现在很多计算机专业的学生考研&#xff0c;也是无奈的选择 技术发展日新月异&#xff0c;而在本科阶段&#xff0c;大家学着落后的技术&#xff0c;出来找工作自然会碰壁。而且现在用人单位的门槛越来越高&#xff0c;学历默认研究生起步&#xff0c;面试一般都是三轮起步…

第十四天-网络爬虫基础

1.什么是爬虫 1.爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff09;&#xff0c;是按照一定规则&#xff0c;自动的抓取万维网中的程序或者脚本&#xff0c;是搜索引擎的重要组成&#xff1b;比如&#xff1a;百度、 2.爬虫应用&#xff1a;1.搜索引擎&…

一周学会Django5 Python Web开发-Django5列表视图ListView

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计27条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

初识Maven

介绍&#xff1a; web后端开发技术ApacheMaven是一个项目管理和构建工具&#xff0c;它基于项目对象模型&#xff08;POM&#xff09;的概念&#xff0c;通过一小段描述信息来管理项目的构建。安装&#xff1a;http://maven.apache.org/ Apache软件基金会&#xff0c;成立于19…

矩阵的范数 matrix norm Frobenius norm 弗罗贝尼乌斯 范数

1&#xff0c;矩阵范数的定义 矩阵的范数&#xff0c;matrix norm即矩阵的模&#xff1b;它把一个矩阵空间变成为赋范线性空间&#xff1b; 从一个矩阵空间映射到非负实数的函数 满足以下条件&#xff1a; 1&#xff0c;严格的正定性。对于 , 则 ; and if , must ; 2&…

2024年【通信安全员ABC证】考试资料及通信安全员ABC证找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年通信安全员ABC证考试资料为正在备考通信安全员ABC证操作证的学员准备的理论考试专题&#xff0c;每个月更新的通信安全员ABC证找解析祝您顺利通过通信安全员ABC证考试。 1、【单选题】《安全色》&#xff08;Gb…

幻兽帕鲁(Palworld 1.4.11.5.0)私有服务器搭建(docker版)

文章目录 说明客户端安装服务器部署1Panel安装和配置docker服务初始化设置设置开机自启动设置镜像加速 游戏服务端部署游戏服务端参数可视化配置 Palworld连接服务器问题总结 服务端升级&#xff08;1.5.0&#xff09; 说明 服务器硬件要求&#xff1a;Linux系统/Window系统&a…

无人机飞行控制系统技术,四旋翼无人机控制系统建模技术详解

物理建模是四旋翼无人机控制系统建模的基础&#xff0c;主要涉及到无人机的物理特性和运动学特性。物理建模的目的是将无人机的运动与输入信号&#xff08;如控制电压&#xff09;之间的关系进行数学描述。 四旋翼无人直升机是具有四个输入力和六个坐标输出的欠驱动动力学旋翼…

13.云原生之常用研发中间件部署

云原生专栏大纲 文章目录 mysql主从集群部署mysql高可用集群高可用互为主从架构互为主从架构如何实现主主复制中若是两台master上同时出现写操作可能会出现的问题该架构是否存在问题&#xff1f; heml部署mysql高可用集群 nacos集群部署官网文档部署nacoshelm部署nacos redis集…

Unity类银河恶魔城学习记录7-8 P74 Pierce sword源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Sword_Skill.cs using System; using System.Collections; using System.C…

VSCode提交代码到git操作指南

前言 点个赞&#xff0c;嘿嘿&#xff01; 直奔主题 一直都有疑问vscode如何将代码提交给git。告别小乌龟&#xff01;告别命令&#xff01; 操作步骤 第一步 登录git账号新建一个仓库&#xff0c;千万不要点击初始化仓库&#xff0c;不然只能clone了&#xff01;&#xff…

Ethernet/IP转Modbus TCP网关

产品功能 1 YC-EIP-TCP工业级EtherNet/IP 网关 2 Modbus TCP 转 EtherNet/IP 3支持ModBus主从站 4 即插即用 无需编程 轻松组态 ,即实现数据交互 5导轨安装 支持提供EDS文件 6 EtherNET/IP与ModBus互转数据透明传输可接入PLC组态 支持CodeSys/支持欧姆龙PLC 支持罗克韦尔(AB) 典…

【MATLAB源码-第151期】基于matlab的开普勒化算法(KOA)无人机三维路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 开普勒优化算法&#xff08;Kepler Optimization Algorithm, KOA&#xff09;是一个虚构的、灵感来自天文学的优化算法&#xff0c;它借鉴了开普勒行星运动定律的概念来设计。在这个构想中&#xff0c;算法模仿行星围绕太阳的…

opencv图像腐蚀

腐蚀&#xff08;Erosion&#xff09;是一种形态学图像处理操作&#xff0c;用于移除图像中的小白点、细小物体或者边缘。它通过将结构元素应用于图像上的像素来实现。 以下是opencv实现图像腐蚀的代码 #include <opencv2/highgui/highgui.hpp> #include <opencv2/im…

IntelliJ IDEA 2023:创新不止步,开发更自由 mac/win版

IntelliJ IDEA 2023激活版是一款强大而智能的集成开发环境(IDE)&#xff0c;为开发者提供了一系列先进的功能和工具&#xff0c;帮助他们更高效地编写、调试和测试代码。 IntelliJ IDEA 2023 软件获取 IntelliJ IDEA 2023继承了其前代版本的优秀基因&#xff0c;并在此基础上进…

用 Python 自动化处理无聊的事情

“编程最棒的部分就是看到机器做一些有用的事情而获得的胜利。用 Python 将无聊的事情自动化将所有编程视为这些小小的胜利&#xff1b;它让无聊变得有趣。” Hilary Mason&#xff0c;数据科学家兼 Fast Forward Labs 创始人 “我很享受打破东西然后把它们重新组合起来的乐趣…

【JavaEE】_前端POST请求使用json向后端传参

目录 1. 关于json 2. 通过Maven仓库&#xff0c;将Jackson下载导入到项目中 3. 使用Jackson 3.1 关于readValue方法 3.2 关于Request.class类对象 3.3 关于request对象的属性类型 3.4 关于writeValueAsString 前端向后端传递参数通常有三种方法&#xff1a; 第一种&…

BTC网络 vs ETH网络

设计理念 BTC 网络 比特币是一种数字货币&#xff0c;旨在作为一种去中心化的、不受政府或金融机构控制的电子货币。其主要目标是实现安全的价值传输和储存&#xff0c;比特币的设计强调去中心化和抗审查。 ETH 网络 以太坊是一个智能合约平台&#xff0c;旨在支持分散的应…

Windows系统x86机器安装(麒麟、统信)ARM系统详细教程

本次介绍在window系统x86机器上安装国产系统 arm 系统的详细教程。 注&#xff1a;ubuntu 的arm系统安装是一样的流程。 1.安装环境准备。 首先&#xff0c;你得有台电脑&#xff0c;配置别太差&#xff0c;至少4核8G内存&#xff0c;安装window10或者11都行&#xff08;为啥…

抖音视频评论批量下载软件|抖音数据抓取工具

随着业务需求的增长&#xff0c;抖音视频的下载需求也日益增加。传统的方式是通过逐个复制粘贴分享链接来下载视频&#xff0c;这种操作效率低下且耗时费力。为了解决这一问题&#xff0c;我们开发了一款基于C#的抖音视频评论批量下载软件&#xff0c;旨在实现通过关键词自动批…