news 2026/4/30 17:56:11

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/1 6:16:26

Node.js ESC/POS打印技术:重新定义硬件控制新范式

Node.js ESC/POS打印技术&#xff1a;重新定义硬件控制新范式 【免费下载链接】node-escpos &#x1f5a8;️ ESC/POS Printer driver for Node.js 项目地址: https://gitcode.com/gh_mirrors/no/node-escpos 在数字化时代&#xff0c;硬件控制与软件开发的融合成为技术…

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

终极指南:COLMAP如何实现地理坐标与3D模型的完美对齐

COLMAP作为开源3D重建工具&#xff0c;通过GPS数据融合技术解决了传统重建模型缺乏地理参考的痛点。本文将带你从零开始掌握这一强大功能&#xff0c;实现从相对坐标系到绝对地理坐标的无缝转换&#xff0c;为测绘、规划、文物保护等领域提供完整解决方案。 【免费下载链接】co…

作者头像 李华
网站建设 2026/5/1 6:17:10

全自动驾驶系统中的汽车纵向与横向控制技术及其优化策略研究

#汽车纵向和横向控制 本项目涉及在全自动驾驶框架内进行汽车纵向和横向控制。 汽车是一个具有非线性纵向和横向耦合动力学的复杂系统。 因此&#xff0c;自动驾驶必须与纵向和横向控制相结合。 我们研究了一种基于模型预测控制的自动转向技术。 为了解决纵向速度跟踪问题&#…

作者头像 李华
网站建设 2026/4/29 14:58:09

SeedVR2-7B完整使用指南:三步实现AI视频质量飞跃

SeedVR2-7B完整使用指南&#xff1a;三步实现AI视频质量飞跃 【免费下载链接】SeedVR2-7B 项目地址: https://ai.gitcode.com/hf_mirrors/ByteDance-Seed/SeedVR2-7B 想要让模糊的视频瞬间清晰如新吗&#xff1f;SeedVR2-7B作为字节跳动推出的革命性AI视频修复工具&…

作者头像 李华