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
更多关于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
来安装依赖。
基本使用
-
初始化插件
在你的
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(); }); }
-
自定义窗口标题栏
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!'), ), ), ); } }
-
窗口控制
你可以通过
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!'), ), ), ); } }
-
窗口大小和位置
你可以通过
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'), ), ), ), ); } }