flutter bitsdojo_window 插件的使用
依赖安装
bitsdojo_window: 0.1.6
flutter pub get
在主入口进行配置 main.dart
- 如果只是配置窗口大小那只需要 配置 doWhenWindowReady(); 即可
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:bitsdojo_window/bitsdojo_window.dart'; //窗口插件
import './window_buttons.dart';
void main() async {
// 在macOS必须配置当前代码
WidgetsFlutterBinding.ensureInitialized();
// WidgetsFlutterBinding.ensureInitialized(); 简单说就是主要处理原生flutter通信的,如果我们需要再main() 中做一些初始化操作就需要加上他 (windows上建议也加上)
// 应用主页面
runApp(const MyApp());
// 配置窗口大小 bitsdojo_window 插件使用配置
doWhenWindowReady(() {
final win = appWindow;
const initialSize = Size(800, 600); //配置尺寸
win.minSize = initialSize; //软件的最小窗口
win.size = initialSize; //默认的窗口大小
// win.maxSize = const Size(900, 600); //最大窗口 一般不配置
win.alignment = Alignment.center; //窗口的位置 启动的时候默认在什么方位
win.title = 'Hello World';
win.show(); //显示
});
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
toolbarHeight: 30, //设置顶部导航条高度
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
// 配置可拖拽窗口区域
title: WindowTitleBarBox(
child: MoveWindow(),
),
// 判断是否为 windows 环境 在macOS环境中无法生效 //import 'dart:io';
actions: [if (Platform.isWindows == true) const WindowButtons()],
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headlineMedium,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}
修改应用顶部导航条
-
windows 中进行配置
\windows\runner\main.cpp
当前文件中添加如下代码// bitsdojo_window 插件使用配置 #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 Cocoa import FlutterMacOS import bitsdojo_window_macos class MainFlutterWindow: BitsdojoWindow { override func bitsdojo_window_configure() -> UInt { // return BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP //去除BDW_HIDE_ON_STARTUP 否则打开应用的时候为隐藏状态 return BDW_CUSTOM_FRAME } override func awakeFromNib() { let flutterViewController = FlutterViewController() let windowFrame = self.frame self.contentViewController = flutterViewController self.setFrame(windowFrame, display: true) RegisterGeneratedPlugins(registry: flutterViewController) super.awakeFromNib() } }
在主入口进行配置 window_buttons.dart
// 配置windows应用窗口按钮
import 'package:flutter/material.dart';
import 'package:bitsdojo_window/bitsdojo_window.dart';
import 'package:flutter_multiterminal_demo/main%20copy%203.dart'; //窗口插件
// 快速生成 statefulW
class WindowButtons extends StatefulWidget {
const WindowButtons({super.key});
@override
State<WindowButtons> createState() => _WindowButtonsState();
}
class _WindowButtonsState extends State<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 buttonColors = WindowButtonColors(
// normal: Colors.grey[600], //普通状态图标背景的颜色
mouseOver: Colors.grey[400], //鼠标到图标时的背景颜色
mouseDown: Colors.grey[400], //鼠标按下时的背景色
iconNormal: Colors.grey[600], //普通状态下按钮的颜色
iconMouseOver: Colors.grey[600], //鼠标移动到按钮图标时的图标颜色
iconMouseDown: Colors.grey[600]); //鼠标按下时按钮图标的颜色
final closeButtonColors = WindowButtonColors(
mouseOver: const Color(0xFFD32F2F),
mouseDown: const Color(0xFFB71C1C),
iconNormal: const Color(0xFF805306),
iconMouseOver: Colors.white);
maximizeOrRestore() {
appWindow.maximizeOrRestore();
}
@override
Widget build(BuildContext context) {
return Row(
children: [
// MouseRegion 鼠标放上去时 鼠标形状发生变化
// MouseRegion(
// cursor: SystemMouseCursors.click,
// child: MinimizeWindowButton(
// colors: buttonColors,
// ),
// ),
MinimizeWindowButton(),
MouseRegion(
cursor: SystemMouseCursors.click,
child: appWindow.isMaximized
? RestoreWindowButton(
colors: buttonColors,
// onPressed 按压事件
onPressed: maximizeOrRestore,
)
: MaximizeWindowButton(
colors: buttonColors,
onPressed: maximizeOrRestore,
)),
MouseRegion(
cursor: SystemMouseCursors.click,
child: CloseWindowButton(
colors: closeButtonColors,
),
),
],
);
}
}