news 2026/5/26 8:09:40

Ai加Flutter实现自定义标题栏(appBar)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ai加Flutter实现自定义标题栏(appBar)

文章目录

  • Ai加Flutter实现自定义标题栏(appBar)
    • 基础需求与环境准备
    • 为什么要自定义标题栏
    • 怎么实现自定义标题栏
      • 需求拆解
        • (第一性原理)——标题栏的构成
        • (类比思维)——AppBar的构成
        • (需求转换)——隐藏系统默认标题栏使用AppBar
      • 自定义标题栏——AppBar
        • (需求拆解)——隐藏与appBar实现对应功能
        • (window_manager)——安装与导入自定义标题栏插件
        • (window_manager)——隐藏默认标题栏
        • 借助window_manager与appBar实现自定义标题栏
        • 借助window_manager实现appBar窗口按钮功能
        • 借助window_manager实现拖动窗口
      • 最终的代码
      • AI询问过程

Ai加Flutter实现自定义标题栏(appBar)

在这篇博客中,笔者会讲诉为什么要实现自定义标题栏标题栏都有些什么功能,然后结合AI简单实现自定义标题栏

话不多说,我们直接开始吧!

基础需求与环境准备

这篇文档默认你的设备已经配置了flutter环境且自身具备了如下:

  • 一定的Dart语法基础
  • 了解甚至熟悉其他桌面应用开发框架(比如:Qt以及其他)
  • 一个flutter空项目->flutter create --empty your_project_name
  • 想要学会flutter的心

补充说明
安装flutter环境来这里
dart语法基础来这里
新手入门项目来这里

注意:学习程度因人而异,如果满足的点越多,理论上学习效率越高!

笔者的环境:

  • Linux:64fedora 43 gnome,桌面系统Wayland,内核版本Linux 6.17.9-300.fc43.x86_64
  • Flutter:Flutter 3.38.5
  • Dart:Dart 3.10.4
  • DevTools:2.51.1
  • 大模型: 通义千问网页版(Qwen3-Coder模型)

为什么要自定义标题栏

我们可以参考常见的应用vscodeQQ微信等这些在(WindowsLinuxmacOS)都有较强的统一风格,这就是自定义标题栏的目的——统一风格

插一嘴:其实自定义标题栏可以避免大量因标题栏样式不统一而导致的问题(比如:gnome49的标题栏不支持暗色主题等)

怎么实现自定义标题栏

需求拆解

(第一性原理)——标题栏的构成

我们需要把这个看似复杂的问题简单化,实现自定义标题栏那我们就要知道标题栏的构成:窗口图标窗口标题窗口按钮(最小化、最大与还原、关闭)!见下图:

注意:gnomemacOS不支持窗口图标!

(类比思维)——AppBar的构成

事实窗口标题栏和flutter中的appBar是吻合的,见下图

(需求转换)——隐藏系统默认标题栏使用AppBar

既然我们已经知道AppBar的功能可以平替窗口标题栏,
那么我们直接隐藏默认的使用AppBar自定义一个不就好了?

自定义标题栏——AppBar

(需求拆解)——隐藏与appBar实现对应功能

关闭系统默认的标题栏
标题栏与AppBar以及功能映射关系

  • 窗口图标 ->leading-> 显示窗口图标
  • 窗口标题 ->title-> 显示窗口标题
  • 窗口图标们 ->actions-> 显示对应图标以及窗口的隐藏,放大复原,关闭
(window_manager)——安装与导入自定义标题栏插件
  1. 安装window_manager
# 终端执行如下:flutter pubaddwindow_manager
  1. 导入插件
// 程序顶部添加如下import'package:window_manager/window_manager.dart';
(window_manager)——隐藏默认标题栏
  1. 替换程序入口代码块
voidmain(){runApp(constMyApp());}

替换为

voidmain()async{WidgetsFlutterBinding.ensureInitialized();awaitwindowManager.ensureInitialized();WindowOptions windowOptions=WindowOptions(titleBarStyle:TitleBarStyle.hidden,);windowManager.waitUntilReadyToShow(windowOptions,()async{awaitwindowManager.focus();});runApp(constMainApp());}

注意: 确保你创建的是空项目
window_manager插件官网

借助window_manager与appBar实现自定义标题栏
  1. 替换脚手架里的内容
body:Center(child:Text('Hello World!'))
//替换为appBar:AppBar(leading:Icon(Icons.favorite),title:Text("自定义标题栏"),actions:[IconButton(onPressed:(){},icon:Icon(Icons.horizontal_rule)),IconButton(onPressed:(){},icon:Icon(Icons.crop_square)),IconButton(onPressed:(){},icon:Icon(Icons.close)),],),

显示效果

借助window_manager实现appBar窗口按钮功能
  1. 添加最小化窗口和关闭窗口
// 替换为如下:appBar:AppBar(leading:Icon(Icons.favorite),title:Text("自定义标题栏"),actions:[IconButton(onPressed:(){windowManager.minimize();},icon:Icon(Icons.horizontal_rule),),IconButton(onPressed:(){},icon:Icon(Icons.crop_square)),IconButton(onPressed:(){windowManager.close();},icon:Icon(Icons.close),),],),
  1. 还原与最大化窗口
// 将 StatelessWidget 转为StatefulWidget// vscode 选中StatelessWidget 显示代码操作(ctrl.)StatefulWidget// _MainAppState 初始化变量用于记录是否最大化bool _isMaximized=false

替换appBar为如下:

appBar:AppBar(leading:Icon(Icons.favorite),title:Text("自定义标题栏"),actions:[IconButton(onPressed:(){windowManager.minimize();},icon:Icon(Icons.horizontal_rule),),IconButton(onPressed:(){if(_isMaximized){windowManager.unmaximize();setState((){_isMaximized=!_isMaximized;});}else{windowManager.maximize();setState((){_isMaximized=!_isMaximized;});}},icon:_isMaximized?Icon(Icons.crop_free):Icon(Icons.crop_square),),IconButton(onPressed:(){windowManager.close();},icon:Icon(Icons.close),),],),

显示效果

借助window_manager实现拖动窗口

简单的办法直接监听鼠标事件

//AppBar里添加如下flexibleSpace:Listener(onPointerDown:(_)=>windowManager.startDragging(),child:Container(color:Colors.transparent),),

光标带拖动效果我的系统并不支持

flexibleSpace:MouseRegion(cursor:SystemMouseCursors.move,child:Listener(onPointerDown:(_)=>windowManager.startDragging(),child:Container(color:Colors.transparent),),),

显示效果

注意:

  • 都是长按鼠标左键拖动窗口,右键鼠标 跟随光标移动
  • 一定要在Container 中添加颜色为透明 不然无法移动

最终的代码

import'package:flutter/material.dart';import'package:window_manager/window_manager.dart';voidmain()async{WidgetsFlutterBinding.ensureInitialized();awaitwindowManager.ensureInitialized();WindowOptions windowOptions=WindowOptions(titleBarStyle:TitleBarStyle.hidden,);windowManager.waitUntilReadyToShow(windowOptions,()async{awaitwindowManager.focus();});runApp(constMainApp());}classMainAppextendsStatefulWidget{constMainApp({super.key});@overrideState<MainApp>createState()=>_MainAppState();}class_MainAppStateextendsState<MainApp>{bool _isMaximized=false;void_toggleMaximize(){if(_isMaximized){windowManager.unmaximize();}else{windowManager.maximize();}setState(()=>_isMaximized=!_isMaximized);}@overrideWidgetbuild(BuildContext context){returnMaterialApp(home:Scaffold(appBar:AppBar(leading:Icon(Icons.favorite),title:Text('自定义标题栏'),flexibleSpace:Listener(onPointerDown:(event)=>windowManager.startDragging(),child:Container(color:Colors.transparent),),actions:[IconButton(icon:Icon(Icons.horizontal_rule),onPressed:windowManager.minimize,),IconButton(icon:Icon(_isMaximized?Icons.crop_free:Icons.crop_square),onPressed:_toggleMaximize,),IconButton(icon:Icon(Icons.close),onPressed:windowManager.close),],),body:Center(child:Text('Hello, World!')),),);}}

AI询问过程

通义AI对话过程

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 5:58:13

数据结构算法篇洗牌算法(特别有意思的算法)

一、算法结构1.我们需要Card类来定义卡牌卡牌需要一个rank&#xff08;牌面数字&#xff09;&#xff0c;和一个suit&#xff08;花色&#xff09;注意要记得写一个toString方法public int rank;//牌面数字public String suit;//花色public Card(int rank, String suit) {this.…

作者头像 李华
网站建设 2026/5/25 23:56:40

论文生成源码排名:9大平台+开源开发工具

论文生成源码排名&#xff1a;9大平台开源开发工具 核心工具对比速览 工具名称 核心功能 处理时间 适配检测系统 特色优势 aibiye 论文降重与AIGC优化 15-30分钟 知网/维普/万方 语义级改写技术&#xff0c;保留学术逻辑 aicheck AIGC检测与降重 20分钟 知网/格子…

作者头像 李华
网站建设 2026/5/25 5:16:37

打造个人专属媒体王国:Jellyfin跨平台一键部署全攻略

还在为手机、电脑、电视上的媒体文件分散管理而头疼吗&#xff1f;想要随时随地欣赏自己的电影收藏却苦于找不到合适的解决方案&#xff1f;今天我要向你推荐一款完全免费、功能强大的个人媒体服务器软件——Jellyfin&#xff0c;让你轻松拥有属于自己的媒体王国&#xff01; 【…

作者头像 李华
网站建设 2026/5/26 4:59:39

文科通讯作者工具:8大平台+规范查询排名

文科通讯作者工具&#xff1a;8大平台规范查询排名 文科通讯作者工具&#xff1a;8大平台规范查询排名 核心工具对比速览 工具名称 核心功能 适用场景 效率评分 特色优势 aibiye 论文选题与框架生成 文科开题报告/文献综述 ★★★★☆ 文科专业适配度高 aicheck 开…

作者头像 李华
网站建设 2026/5/26 4:56:12

深蓝词库转换:跨平台输入法词库迁移终极指南

深蓝词库转换&#xff1a;跨平台输入法词库迁移终极指南 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 你是否曾经因为更换输入法而苦恼于词库无法迁移&#xff1f;…

作者头像 李华
网站建设 2026/5/26 4:52:49

离线安装.net3.5 sp

把提取的SXS放在C盘根目录&#xff0c;在管理员模式下powershell或者cmd复制下面脚本直接运行。 把sxs文件夹放到C盘根目录了&#xff0c;那么直接用如下代码即可 dism.exe /online /enable-feature /featurename:netfx3 /Source:C:\sxs 源网址在&#xff1a; 源网址在 Win10…

作者头像 李华