其实还不能完全算是自定义窗口。比如异形窗口就没有解决。
bitsdojo_window 是一个用来定制桌面端窗口的插件
pubspec.yaml: bitsdojo_window: ^last_version
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);
以下示例被我修改过
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.title = "可以自定义的窗口";
win.alignment = Alignment.center;
win.show();
});
}
const borderColor = Color.fromARGB(255, 31, 21, 3);
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 [RightSide()],
),
),
),
);
}
}
const backgroundStartColor = Color.fromARGB(255, 235, 234, 229);
const backgroundEndColor = Color.fromARGB(255, 196, 184, 164);
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
_WindowButtonsState 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 run -d windows 或 fluttter build windows