bitsdojo_window
一个 Flutter 包,可轻松自定义和处理您的 Flutter 桌面应用程序窗口,支持 **Windows、macOS 和 Linux**。
观看教程以开始。点击下面的图片观看视频
功能:
- 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),
],
);
}
}
❤️ **赞助商 – 帮助此包的朋友**
我利用业余时间开发此包,任何帮助都将不胜感激。
如果您想提供帮助,可以 成为赞助商。
? 谢谢!
☕️ 咖啡支持者
每月赞助一杯咖啡以提供帮助
想帮忙?成为赞助商

