Flutter桌面窗口管理插件bitsdojo_window_support的使用

Flutter桌面窗口管理插件bitsdojo_window_support的使用

bitsdojo_window_support 是一个用于 Flutter 桌面应用 的包,它使得在 Windows、macOS 和 Linux 上自定义和操作 Flutter 应用程序窗口变得非常简单。

特性:

  • 自定义窗口框架:移除标准的 Windows/macOS/Linux 标题栏和按钮。
  • 启动时隐藏窗口。
  • 显示/隐藏窗口。
  • 使用 Flutter 小部件移动窗口。
  • 最小化/最大化/恢复/关闭窗口。
  • 设置窗口大小、最小尺寸和最大尺寸。
  • 设置窗口位置。
  • 设置窗口在屏幕上的对齐方式(中心/左上/右上/左下/右下)。
  • 设置窗口标题。

开始使用

安装插件

首先,在项目的 pubspec.yaml 文件中添加以下依赖项:

dependencies:
  bitsdojo_window_support: ^0.1.0

然后运行 flutter pub get 来安装依赖。


配置不同平台

Windows

在你的项目目录中找到 windows\runner\main.cpp 文件,并在文件开头添加以下两行代码:

#include <bitsdojo_window_windows/bitsdojo_window_plugin.h>
auto bdw = bitsdojo_window_configure(BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP);
macOS

在你的项目目录中找到 macos\runner\MainFlutterWindow.swift 文件,并在 import FlutterMacOS 后添加以下代码:

import bitsdojo_window_macos

然后将 class MainFlutterWindow: NSWindow 修改为 class MainFlutterWindow: BitsdojoWindow。接下来,在 bitsdojo_window_configure 方法中返回标志位:

override func bitsdojo_window_configure() -> UInt {
  return BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP
}

完整代码示例如下:

class MainFlutterWindow: BitsdojoWindow {
    
  override func bitsdojo_window_configure() -> UInt {
    return BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP
  }
    
  override func awakeFromNib() {
    // 其余代码保持不变
  }
}

如果不想使用自定义框架或隐藏窗口启动时的界面,可以移除相应的标志位。

Linux

在你的项目目录中找到 linux\my_application.cc 文件,并在文件开头添加以下代码:

#include <bitsdojo_window_linux/bitsdojo_window_plugin.h>

然后找到以下代码:

gtk_window_set_default_size(window, 1280, 720);
gtk_widget_show(GTK_WIDGET(window));

将其替换为以下代码:

auto bdw = bitsdojo_window_from(window);
bdw->setCustomFrame(true);
// gtk_window_set_default_size(window, 1280, 720);
gtk_widget_show(GTK_WIDGET(window));

Flutter 应用集成

lib\main.dart 文件中,添加以下代码到 main 函数中,以设置窗口的初始大小、最小尺寸并居中显示窗口:

void main() {
  runApp(const MyApp());

  // 初始化窗口配置
  doWhenWindowReady(() {
    const initialSize = Size(600, 450);
    appWindow.minSize = initialSize;
    appWindow.size = initialSize;
    appWindow.alignment = Alignment.center;
    appWindow.title = "自定义窗口与 Flutter";
    appWindow.show();
  });
}

示例代码

以下是一个完整的示例代码,展示如何创建一个带有自定义窗口边框和按钮的 Flutter 应用程序:

import 'package:flutter/material.dart';
import 'package:bitsdojo_window_support/bitsdojo_window_support.dart';

void main() {
  runApp(const MyApp());

  // 初始化窗口配置
  doWhenWindowReady(() {
    final win = appWindow;
    const initialSize = Size(600, 450);
    win.minSize = initialSize;
    win.size = initialSize;
    win.alignment = Alignment.center;
    win.title = "自定义窗口与 Flutter";
    win.show();
  });
}

const borderColor = Color(0xFF805306);

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: WindowBorder(
          color: borderColor,
          width: 1,
          child: Row(
            children: const [LeftSide(), RightSide()],
          ),
        ),
      ),
    );
  }
}

const sidebarColor = Color(0xFFF6A00C);

class LeftSide extends StatelessWidget {
  const LeftSide({Key? key}) : super(key: key);
  [@override](/user/override)
  Widget build(BuildContext context) {
    return SizedBox(
        width: 200,
        child: Container(
            color: sidebarColor,
            child: Column(
              children: [
                WindowTitleBarBox(child: MoveWindow()),
                Expanded(child: Container())
              ],
            )));
  }
}

const backgroundStartColor = Color(0xFFFFD500);
const backgroundEndColor = Color(0xFFF6A00C);

class RightSide extends StatelessWidget {
  const RightSide({Key? key}) : super(key: key);
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Expanded(
      child: Container(
        decoration: const BoxDecoration(
          gradient: LinearGradient(
              begin: Alignment.topCenter,
              end: Alignment.bottomCenter,
              colors: [backgroundStartColor, backgroundEndColor],
              stops: [0.0, 1.0]),
        ),
        child: Column(children: [
          WindowTitleBarBox(
            child: Row(
              children: [Expanded(child: MoveWindow()), const WindowButtons()],
            ),
          )
        ]),
      ),
    );
  }
}

final buttonColors = WindowButtonColors(
    iconNormal: const Color(0xFF805306),
    mouseOver: const Color(0xFFF6A00C),
    mouseDown: const Color(0xFF805306),
    iconMouseOver: const Color(0xFF805306),
    iconMouseDown: const Color(0xFFFFD500));

final closeButtonColors = WindowButtonColors(
    mouseOver: const Color(0xFFD32F2F),
    mouseDown: const Color(0xFFB71C1C),
    iconNormal: const Color(0xFF805306),
    iconMouseOver: Colors.white);

class WindowButtons extends StatelessWidget {
  const WindowButtons({Key? key}) : super(key: key);
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Row(
      children: [
        MinimizeWindowButton(colors: buttonColors),
        MaximizeWindowButton(colors: buttonColors),
        CloseWindowButton(colors: closeButtonColors),
      ],
    );
  }
}

更多关于Flutter桌面窗口管理插件bitsdojo_window_support的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter桌面窗口管理插件bitsdojo_window_support的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


bitsdojo_window_support 是一个用于 Flutter 桌面应用程序的插件,它允许开发者自定义和管理应用程序窗口的行为,例如窗口的标题栏、窗口大小、窗口位置等。这个插件特别适用于需要自定义窗口外观和行为的桌面应用程序。

安装

首先,你需要在 pubspec.yaml 文件中添加 bitsdojo_window_support 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  bitsdojo_window_support: ^0.1.0

然后运行 flutter pub get 来安装依赖。

基本使用

  1. 初始化插件

    在你的 main.dart 文件中,初始化 bitsdojo_window_support 插件:

    import 'package:bitsdojo_window_support/bitsdojo_window_support.dart';
    
    void main() {
      runApp(MyApp());
      doWhenWindowReady(() {
        final win = appWindow;
        win.size = Size(800, 600);
        win.alignment = Alignment.center;
        win.title = "My Flutter App";
        win.show();
      });
    }
    
  2. 自定义窗口标题栏

    bitsdojo_window_support 允许你隐藏默认的窗口标题栏,并使用 Flutter 控件来创建自定义的标题栏。

    import 'package:flutter/material.dart';
    import 'package:bitsdojo_window_support/bitsdojo_window_support.dart';
    
    void main() {
      runApp(MyApp());
      doWhenWindowReady(() {
        final win = appWindow;
        win.size = Size(800, 600);
        win.alignment = Alignment.center;
        win.title = "My Flutter App";
        win.show();
      });
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('Custom Title Bar'),
            ),
            body: Center(
              child: Text('Hello, World!'),
            ),
          ),
        );
      }
    }
    
  3. 窗口控制

    你可以通过 appWindow 对象来控制窗口的行为,例如最小化、最大化、关闭窗口等。

    import 'package:flutter/material.dart';
    import 'package:bitsdojo_window_support/bitsdojo_window_support.dart';
    
    void main() {
      runApp(MyApp());
      doWhenWindowReady(() {
        final win = appWindow;
        win.size = Size(800, 600);
        win.alignment = Alignment.center;
        win.title = "My Flutter App";
        win.show();
      });
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('Window Controls'),
              actions: [
                IconButton(
                  icon: Icon(Icons.minimize),
                  onPressed: () {
                    appWindow.minimize();
                  },
                ),
                IconButton(
                  icon: Icon(Icons.close),
                  onPressed: () {
                    appWindow.close();
                  },
                ),
              ],
            ),
            body: Center(
              child: Text('Hello, World!'),
            ),
          ),
        );
      }
    }
    
  4. 窗口大小和位置

    你可以通过 appWindow 对象来设置窗口的大小和位置。

    import 'package:flutter/material.dart';
    import 'package:bitsdojo_window_support/bitsdojo_window_support.dart';
    
    void main() {
      runApp(MyApp());
      doWhenWindowReady(() {
        final win = appWindow;
        win.size = Size(800, 600);
        win.alignment = Alignment.center;
        win.title = "My Flutter App";
        win.show();
      });
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('Window Size and Position'),
            ),
            body: Center(
              child: ElevatedButton(
                onPressed: () {
                  appWindow.size = Size(1024, 768);
                  appWindow.alignment = Alignment.topLeft;
                },
                child: Text('Resize and Reposition Window'),
              ),
            ),
          ),
        );
      }
    }
回到顶部