bitsdojo_window

一个 Flutter 包,可轻松自定义和处理您的 Flutter 桌面应用程序窗口,支持 **Windows、macOS 和 Linux**。

观看教程以开始。点击下面的图片观看视频

IMAGE ALT TEXT

功能:

- Custom window frame - remove standard Windows/macOS/Linux titlebar and buttons
- Hide window on startup
- Show/hide window
- Move window using Flutter widget
- Minimize/Maximize/Restore/Close window
- Set window size, minimum size and maximum size
- Set window position
- Set window alignment on screen (center/topLeft/topRight/bottomLeft/bottomRight)
- Set window title

入门

使用 pubspec.yaml 安装包

对于 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 // Add this line

然后将此行从

class MainFlutterWindow: NSWindow {

更改为

class MainFlutterWindow: BitsdojoWindow {

NSWindow 更改为 BitsdojoWindow 后,在更改的行下方添加这些行

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() {
    ... //rest of your code

如果您不想使用自定义框架,而是希望使用标准的窗口标题栏和按钮,则可以从上面的代码中删除 BDW_CUSTOM_FRAME 标志。

如果您不想在启动时隐藏窗口,则可以从上面的代码中删除 BDW_HIDE_ON_STARTUP 标志。

对于 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);            // <--- add this line
bdw->setCustomFrame(true);                          // <-- add this line
//gtk_window_set_default_size(window, 1280, 720);   // <-- comment this line
gtk_widget_show(GTK_WIDGET(window));

如您所见,我们注释掉了调用 gtk_window_set_default_size 的行,并在 gtk_widget_show(GTK_WIDGET(window)); 之前添加了这两行

auto bdw = bitsdojo_window_from(window);
bdw->setCustomFrame(true);

Flutter 应用集成

现在转到 lib\main.dart 并在 main 函数中 runApp(MyApp()); 之后添加此代码

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

  // Add this code below

  doWhenWindowReady(() {
    const initialSize = Size(600, 450);
    appWindow.minSize = initialSize;
    appWindow.size = initialSize;
    appWindow.alignment = Alignment.center;
    appWindow.show();
  });
}

这将为您的应用程序窗口设置初始大小和最小大小,使其在屏幕上居中并显示它。

您可以在 example 文件夹中找到示例。

这是一个显示此窗口的示例

点击展开

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 StatelessWidget {
  const WindowButtons({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        MinimizeWindowButton(colors: buttonColors),
        MaximizeWindowButton(colors: buttonColors),
        CloseWindowButton(colors: closeButtonColors),
      ],
    );
  }
}

❤️ **赞助商 – 帮助此包的朋友**

我利用业余时间开发此包,任何帮助都将不胜感激。

如果您想提供帮助,可以 成为赞助商

? 谢谢!

☕️ 咖啡支持者

每月赞助一杯咖啡以提供帮助

想帮忙?成为赞助商

GitHub

https://github.com/bitsdojo/bitsdojo_window