You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Windows端标题栏自定义失败求助:如何设置透明标题栏

Windows平台Flutter应用透明标题栏实现方案

你的现有代码存在两个核心问题:一是customizeTitleBar函数从未被调用,二是缺少实现标题栏透明的关键逻辑(仅创建了菜单但未对窗口样式做实际修改)。以下是可直接运行的实现方案:

实现步骤与代码修改

  1. 将主页面改为StatefulWidget
    需在窗口初始化完成后调用标题栏修改逻辑,因此把MyHomePage改为StatefulWidget:

  2. 完善标题栏透明逻辑
    使用Win32的DWM(桌面窗口管理器)API设置标题栏透明,替换原有无效的customizeTitleBar函数:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:sqflite/sqflite.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'dart:io';
import 'package:transaction_managment/Screens/HomeScreen.dart';
import 'package:win32/win32.dart';

void main() {
  if (Platform.isWindows || Platform.isLinux) {
    sqfliteFfiInit();
  }
  databaseFactory = databaseFactoryFfi;
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'AccountAce',
      theme: ThemeData(
        primarySwatch: Colors.green,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  void initState() {
    super.initState();
    if (Platform.isWindows) {
      // 窗口渲染完成后执行标题栏修改
      WidgetsBinding.instance.addPostFrameCallback((_) {
        customizeTitleBar();
      });
    }
  }

  void customizeTitleBar() {
    // 通过窗口标题获取准确的Flutter窗口句柄
    final hWnd = FindWindow(nullptr, TEXT('AccountAce'));
    if (hWnd == 0) return;

    // 设置标题栏背景为完全透明(ARGB格式,0x00开头表示透明度为0)
    const transparentColor = 0x00FFFFFF;
    DwmSetWindowAttribute(
      hWnd,
      DWMWA_CAPTION_COLOR,
      transparentColor,
      sizeOf<DWORD>(),
    );

    // 可选:关闭窗口过渡动画,避免透明标题栏出现异常闪烁
    DwmSetWindowAttribute(
      hWnd,
      DWMWA_TRANSITIONS_FORCEDISABLED,
      true,
      sizeOf<BOOL>(),
    );
  }

  @override
  Widget build(BuildContext context) {
    // 隐藏Flutter自带AppBar,让内容延伸到透明标题栏下方
    return Scaffold(
      extendBodyBehindAppBar: true,
      body: const HomeScreen(),
    );
  }
}

关键说明

  • 窗口句柄获取:用FindWindow通过窗口标题(即MaterialApp的title)定位Flutter窗口,比GetForegroundWindow更可靠,避免获取到其他窗口。
  • DWM属性配置:DWMWA_CAPTION_COLOR直接设置标题栏背景色为完全透明;DWMWA_TRANSITIONS_FORCEDISABLED可选关闭过渡动画,优化透明效果的视觉体验。
  • Flutter页面适配:extendBodyBehindAppBar: true让页面内容延伸到标题栏区域,实现视觉上的一体化效果。

内容的提问来源于stack exchange,提问作者Buddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 18:53:16