Flutter-左侧导航栏跟随窗口的宽变化

devtools/2024/11/19 3:08:14/
htmledit_views">

前言

现在有一个需求:左侧导航栏跟随窗口的宽度变化而变化

  • 当宽度>1000时,左侧导航栏全部展示,
  • 1000>宽度>500时,左侧导航栏只展示图标,
  • 500>宽度时,左侧导航栏消失,顶部出现菜单选择图标,点击后可以选择菜单内容

我们要实现上面的功能就需要使用到屏幕的自适应功能,我这里主要用到的就是LayoutBuilder这个组件

操作流程

  • 获取屏幕的宽度
  • 当屏幕小于指定值时,左侧导航栏展示一个宽高都为0的组件,反之展示全部内容
  • 我的左侧导航栏中的每一项格式相同,因此我将之抽离了出来并命名为LeftNavigationBarItemWidget。当宽度小于一定范围时,LeftNavigationBarItemWidget只展示图标,反之展示图标和文本
  • 通过上面的3步就实现了左侧导航栏的变化

具体步骤

1.在左侧导航栏的代码中获取屏幕的宽度

Size screenSize = MediaQuery.of(context).size;
double winWidth = screenSize.width;

2.使用LayoutBuilder组件判断当窗口屏幕小于指定值是展示空内容,反之展示

LayoutBuilder(builder: (p0, p1) {if (winWidth < leftNavigationBarSelfValue1) {return Container();} else {return Container(height: double.infinity,width: winWidth < leftNavigationBarSelfValue ? 60 : 280,color: Colors.white,padding: const EdgeInsets.only(top: 20),child: SingleChildScrollView(child: Column(children: MenuValue.LeftNavigationBarItems.map((e) => LeftNavigationBarItemWidget(item: e,active: widget.selectRoute == e.route,)).toList(),),),);}},);

3.当窗口小于一定值后左侧导航栏的每一项(LeftNavigationBarItemWidget组件),就只展示图标,不展示文本内容

LayoutBuilder(builder: (p0, p1) {if (winWidth < leftNavigationBarSelfValue) {return Center(child: Icon(Icons.wallet,color: active ? activeTextColor : initIconColor,),);} else {return OriginalSizeItemWidget(active: active,activeTextColor: activeTextColor,initIconColor: initIconColor,widget: widget,initTextColor: initTextColor);}},)

至此就实现了左侧导航栏跟随窗口宽度改变而改变

全部代码

import 'package:html" title=flutter>flutter/material.dart';
import 'package:get/get.dart';
import 'package:my_app/common/store/limits_of_authority.dart';
import 'package:my_app/common/value/menu.dart';
import 'package:my_app/common/value/self_adaption_value.dart';
import 'package:provider/provider.dart';import '../../../routes/names.dart';class LeftNavigationBar extends StatefulWidget {const LeftNavigationBar({super.key,required this.selectRoute,});final String selectRoute;@overrideState<LeftNavigationBar> createState() => _LeftNavigationBarState();
}class _LeftNavigationBarState extends State<LeftNavigationBar> {@overrideWidget build(BuildContext context) {Size screenSize = MediaQuery.of(context).size;double winWidth = screenSize.width;return LayoutBuilder(builder: (p0, p1) {if (winWidth < leftNavigationBarSelfValue1) {return Container();} else {return Container(height: double.infinity,width: winWidth < leftNavigationBarSelfValue ? 60 : 280,color: Colors.white,padding: const EdgeInsets.only(top: 20),child: SingleChildScrollView(child: Column(children: MenuValue.LeftNavigationBarItems.map((e) => LeftNavigationBarItemWidget(item: e,active: widget.selectRoute == e.route,)).toList(),),),);}},);}
}class LeftNavigationBarItemWidget extends StatefulWidget {const LeftNavigationBarItemWidget({super.key,required this.active,required this.item,this.isHeard = false,});final bool active;final LeftNavigationBarItem item;final bool? isHeard;@overrideState<LeftNavigationBarItemWidget> createState() =>_LeftNavigationBarItemWidgetState();
}class _LeftNavigationBarItemWidgetStateextends State<LeftNavigationBarItemWidget> {bool _hovering = false;final Color initBgcColor = Colors.white;final Color activeBgcColor = const Color.fromRGBO(229, 240, 255, 1);final Color initTextColor = const Color.fromRGBO(40, 40, 40, 1);final Color activeTextColor = const Color.fromRGBO(0, 111, 255, 1);final Color initIconColor = const Color.fromRGBO(167, 185, 210, 1);@overrideWidget build(BuildContext context) {bool active = widget.active || _hovering;Size screenSize = MediaQuery.of(context).size;double winWidth = screenSize.width;return Container(width: double.infinity,height: 60,color: active ? activeBgcColor : initBgcColor,// padding: ,child: InkWell(onTap: () {Provider.of<LimitsOfAuthorityStore>(context, listen: false).selectMenuNum = widget.item.id;Get.offNamed("/${widget.item.route}");},onHover: (value) {setState(() {_hovering = value;});},child: !widget.isHeard!? LayoutBuilder(builder: (p0, p1) {if (winWidth < leftNavigationBarSelfValue) {return Center(child: Icon(Icons.wallet,color: active ? activeTextColor : initIconColor,),);} else {return OriginalSizeItemWidget(active: active,activeTextColor: activeTextColor,initIconColor: initIconColor,widget: widget,initTextColor: initTextColor);}},): OriginalSizeItemWidget(active: active,activeTextColor: activeTextColor,initIconColor: initIconColor,widget: widget,initTextColor: initTextColor),),);}
}class OriginalSizeItemWidget extends StatelessWidget {const OriginalSizeItemWidget({super.key,required this.active,required this.activeTextColor,required this.initIconColor,required this.widget,required this.initTextColor,});final bool active;final Color activeTextColor;final Color initIconColor;final LeftNavigationBarItemWidget widget;final Color initTextColor;@overrideWidget build(BuildContext context) {return Row(mainAxisSize: MainAxisSize.min,children: [const SizedBox(width: 32,),Icon(Icons.wallet,color: active ? activeTextColor : initIconColor,),const SizedBox(width: 8,),Text(widget.item.label,style: TextStyle(color: active ? activeTextColor : initTextColor,),),],);}
}class LeftNavigationBarItem {//菜单栏对应的Idfinal int id;//菜单栏的图标final IconData icon;//菜单栏的文字final String label;final String route;const LeftNavigationBarItem({required this.icon,required this.label,required this.id,required this.route,});
}


http://www.ppmy.cn/devtools/135098.html

相关文章

一文了解Android的核心系统服务

在 Android 系统中&#xff0c;核心系统服务&#xff08;Core System Services&#xff09;是应用和系统功能正常运行的基石。它们负责提供系统级的资源和操作支持&#xff0c;包含了从启动设备、管理进程到提供应用基础组件的方方面面。以下是 Android 中一些重要的核心系统服…

AI服务器SAS硬盘汰换与数据抹除指南

抹除机—快速学会AI服务器中的SAS硬盘该如何汰换 引言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;AI服务器的需求持续增长。这些服务器不仅需要高效的数据处理能力&#xff0c;还需具备可靠的数据存取与存储性能。SAS硬盘在这样的背景下&#xff0c;…

C#编程:优化【性别和成绩名次】均衡分班

标题 C#编程&#xff0c;实现&#xff08;男女和成绩&#xff09;均衡分班 正文 上一篇用ExceVBA完成的分班&#xff0c;请看文章 ExcelVBA代码实现按性别和成绩名次均衡分班 网友提出问题用VbA对班级学生随机分组&#xff0c;考虑男女人数和考试成绩均衡 一、需求分析 用户需要…

拆解测试显示Mac Mini (2024)固态硬盘并未锁定 互换硬盘后仍可使用

此前已经有维修达人尝试将 Mac Mini (2024) 固态硬盘上的 NAND 闪存拆下并替换实现扩容&#xff0c;例如可以从 256GB 扩容到 2TB。虽然接口类似于 NVMe M.2 SSD 但直接安装普通硬盘是无效的&#xff0c;苹果仍然通过某种机制检测硬盘是否能够兼容。 不过知名拆解网站 iFixit 的…

K8S 查看pod节点的磁盘和内存使用情况

查看某个节点的磁盘使用率&#xff1a; kubectl exec -it pod名称 -n 命名空间 – df -h 查询所有节点的已使用内存&#xff1a; kubectl top pods --all-namespaces | grep itsm 查询某个节点的总内存&#xff0c; kubectl describe pod itsr-domain-59f4ff5854-hzb68 --nam…

Python 小高考篇(6)常见错误及排查

目录 TypeError拼接字符串和数字错误示范正确示范 数字、字符串当成函数错误示范 给函数传入未被定义过的参数错误示范 传入的参数个数不正确错误示范 字符串相乘错误示范正确示范 量取整数的长度错误示范正确示范 格式化字符串时占位符个数不正确错误示范 给复数比较大小错误示…

小程序如何完成订阅

小程序如何完成订阅 参考相关文档实践问题处理授权弹窗不再触发引导用户重新授权 参考相关文档 微信小程序实现订阅消息推送的实现步骤 发送订阅消息 小程序订阅消息&#xff08;用户通过弹窗订阅&#xff09;开发指南 实践 我们需要先选这一个模板&#xff0c;具体流程参考…

macOS系统下使用SQLark连接达梦数据库

目录 下载 SQLark 客户端 安装 SQLark 客户端 SQLark用户界面 使用SQLark连接达梦数据库 1. 选择达梦数据库 2. 输入连接信息 3. 测试连接 4. 创建连接 5. 验证连接成功 作为一名数据库开发者&#xff0c;在macOS系统上找到一款支持达梦数据库的数据库开发和管理工具&…