news 2026/7/18 11:40:58

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/7/18 3:06:01

论文提纲生成工具排名:AI如何帮你一键搞定论文框架

论文提纲生成工具排名&#xff1a;AI如何帮你一键搞定论文框架 论文提纲生成工具核心对比 工具名称 生成速度 逻辑性 学术深度 适用阶段 AIbiye ⚡⚡⚡⚡ ⭐⭐⭐⭐ ⭐⭐⭐ 选题/大纲 AICheck ⚡⚡⚡ ⭐⭐⭐⭐ ⭐⭐⭐⭐ 大纲/开题 AskPaper ⚡⚡ ⭐⭐⭐ ⭐⭐…

作者头像 李华
网站建设 2026/7/17 6:53:38

免费查重工具排名:7大平台+官网推荐

免费查重工具排名&#xff1a;7大平台官网推荐 核心工具对比速览 工具名称 查重效率 特色功能 适用场景 官网直达 Aibiye 20分钟 AIGC查重降重 学术论文深度优化 aibiye.com AICheck 15分钟 多维度AI检测 快速筛查AI生成内容 aicheck.com AskPaper 25分钟 学…

作者头像 李华
网站建设 2026/7/18 1:40:01

QFileInfoList-基础-问题盘点

这里是目录标题提问代码内存分配的核心原因entryInfoList()的执行逻辑&#xff1a;内存分配的细节内存管理的注意事项后果互动提问 你是否为了解QFileInfoList而惊喜过&#xff1f;你是否还不曾对QFileInfoList苦恼过&#xff1f; 不管是与不是&#xff0c;我都将抛出疑问&…

作者头像 李华
网站建设 2026/7/17 16:24:30

华硕笔记本优化终极指南:3分钟解锁隐藏性能

华硕笔记本优化终极指南&#xff1a;3分钟解锁隐藏性能 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地址: https:/…

作者头像 李华
网站建设 2026/7/17 19:50:01

构建系统性能优化实战:从诊断瓶颈到落地最佳方案

构建系统性能优化实战&#xff1a;从诊断瓶颈到落地最佳方案 【免费下载链接】bazel a fast, scalable, multi-language and extensible build system 项目地址: https://gitcode.com/GitHub_Trending/ba/bazel 你是否经历过这样的场景&#xff1a;团队规模扩大后&#…

作者头像 李华
网站建设 2026/7/18 1:33:13

OrcaSlicer 3D打印速度终极调优:从诊断到实战的精准提速方案

OrcaSlicer 3D打印速度终极调优&#xff1a;从诊断到实战的精准提速方案 【免费下载链接】OrcaSlicer G-code generator for 3D printers (Bambu, Prusa, Voron, VzBot, RatRig, Creality, etc.) 项目地址: https://gitcode.com/GitHub_Trending/orc/OrcaSlicer 你是否经…

作者头像 李华