Flutter窗口管理插件bitsdojo_window的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter窗口管理插件bitsdojo_window的使用

bitsdojo_window 是一个用于在 Windows、macOS 和 Linux 上自定义和操作 Flutter 桌面应用程序窗口的插件。本文将介绍如何在不同的平台上配置该插件,并提供完整的示例代码。

特性

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

开始使用

安装插件

pubspec.yaml 文件中添加以下依赖:

dependencies:
  bitsdojo_window: ^0.2.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 FlutterMacOS
import bitsdojo_window_macos // 添加此行

然后将以下代码:

class MainFlutterWindow: NSWindow {

改为:

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 函数中的 runApp(MyApp()); 之后:

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 = "Custom window with Flutter";
    win.show();
  });
}

示例代码

以下是一个完整的示例代码,展示了如何使用 bitsdojo_window 插件创建一个自定义窗口的应用程序:

import 'package:flutter/material.dart';
import 'package:bitsdojo_window/bitsdojo_window.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 = "Custom window with Flutter";
    win.show();
  });
}

const borderColor = Color(0xFF805306);

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

  @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
  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
  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 StatefulWidget {
  const WindowButtons({Key? key}) : super(key: key);

  @override
  State<WindowButtons> createState() => _WindowButtonsState();
}

class _WindowButtonsState extends State<WindowButtons> {
  void maximizeOrRestore() {
    setState(() {
      appWindow.maximizeOrRestore();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        MinimizeWindowButton(colors: buttonColors),
        appWindow.isMaximized
            ? RestoreWindowButton(
                colors: buttonColors,
                onPressed: maximizeOrRestore,
              )
            : MaximizeWindowButton(
                colors: buttonColors,
                onPressed: maximizeOrRestore,
              ),
        CloseWindowButton(colors: closeButtonColors),
      ],
    );
  }
}

以上代码展示了如何创建一个带有自定义窗口边框、可拖动区域以及最小化、最大化和关闭按钮的 Flutter 应用程序。希望这对您有所帮助!


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用bitsdojo_window插件进行窗口管理的代码示例。这个插件允许你自定义和控制Flutter桌面应用的窗口行为,比如最小化、最大化、关闭以及窗口尺寸和位置等。

步骤 1: 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  bitsdojo_window: ^0.0.5  # 请检查最新版本号

步骤 2: 导入包

在你的主文件(通常是main.dart)中导入bitsdojo_window包:

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

步骤 3: 配置窗口管理

在应用的入口点(main函数)中配置窗口管理。下面是一个简单的示例,展示如何设置窗口标题、大小以及添加一些基本的窗口事件监听:

void main() {
  // 初始化BitsdojoWindow
  BitsdojoWindow window = BitsdojoWindow();

  // 设置窗口标题
  window.setTitle('My Flutter App');

  // 设置窗口初始大小和位置
  window.setSize(1200, 800);
  window.center();

  // 添加窗口事件监听
  window.addListener(() {
    if (window.isMaximized) {
      print('Window is maximized');
    } else if (window.isMinimized) {
      print('Window is minimized');
    } else if (window.isFocused) {
      print('Window is focused');
    }
  });

  // 运行Flutter应用
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Window Management'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () {
                  BitsdojoWindow().minimize();
                },
                child: Text('Minimize'),
              ),
              ElevatedButton(
                onPressed: () {
                  BitsdojoWindow().maximize();
                },
                child: Text('Maximize'),
              ),
              ElevatedButton(
                onPressed: () {
                  BitsdojoWindow().restore();
                },
                child: Text('Restore'),
              ),
              ElevatedButton(
                onPressed: () {
                  BitsdojoWindow().close();
                },
                child: Text('Close'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

说明

  1. 窗口初始化: 使用BitsdojoWindow()实例来管理窗口。
  2. 设置窗口属性: 通过setTitlesetSizecenter等方法设置窗口的标题、大小和位置。
  3. 监听窗口事件: 使用addListener方法来监听窗口状态的变化,比如最大化、最小化和焦点状态。
  4. 按钮操作: 在UI中添加了四个按钮,分别用于最小化、最大化、恢复和关闭窗口。

注意事项

  • 确保你正在开发一个桌面应用,因为bitsdojo_window插件是为桌面平台设计的。
  • 在运行代码之前,请检查bitsdojo_window的最新版本,因为API可能会随着版本更新而变化。

通过上述代码,你可以在Flutter桌面应用中实现基本的窗口管理功能。如果你有更复杂的需求,可以参考bitsdojo_window的官方文档以获取更多信息。

回到顶部