桌面端窗口
使用window_manager
在项目中使用下面的命令来安装:
bash
flutter pub add window_manager
配置window_manager
注意:不同系统需要进行不同的配置,可以点击这里查看
对于macOS
swift
import Cocoa
import FlutterMacOS
import window_manager
class MainFlutterWindow: NSWindow {
override func awakeFromNib() {
let flutterViewController = FlutterViewController()
self.backgroundColor = NSColor.clear
flutterViewController.backgroundColor = NSColor.clear
let windowFrame = self.frame
self.contentViewController = flutterViewController
self.setFrame(windowFrame, display: true)
RegisterGeneratedPlugins(registry: flutterViewController)
super.awakeFromNib()
}
override public func order(_ place: NSWindow.OrderingMode, relativeTo otherWin: Int) {
super.order(place, relativeTo: otherWin)
hiddenWindowAtLaunch()
}
}
对于Windows
cpp
// windows/runner/win32_window.cpp
// ...
flutter_controller_->engine()->SetNextFrameCallback([&]() {
this->Show();
// this->Show();
});
// ...
在main.dart
中这样修改主函数:
dart
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await windowManager.ensureInitialized();
WindowOptions windowOptions = WindowOptions(
size: Size(800, 600),
center: true,
backgroundColor: Colors.transparent,
skipTaskbar: false,
titleBarStyle: TitleBarStyle.hidden,
);
windowManager.waitUntilReadyToShow(windowOptions, () async {
await windowManager.show();
await windowManager.focus();
});
runApp(MyApp());
}
标题栏
dart
// 注意添加with WindowListener
class _MainWindowState extends State<MainWindow> with WindowListener {
@override
void initState() {
super.initState();
windowManager.addListener(this);
}
@override
void dispose() {
windowManager.removeListener(this);
super.dispose();
}
bool isMax=false;
@override
void onWindowMaximize(){
setState(() {
isMax=true;
});
}
@override
void onWindowUnmaximize(){
setState(() {
isMax=false;
});
}
@override
Widget build(BuildContext context) {
return Column(
children: [
SizedBox(
height: 30,
child: Row(
children: [
Expanded(child: DragToMoveArea(child: Container())),
if(Platform.isWindows) Row(
children: [
WindowCaptionButton.minimize(
brightness: Theme.of(context).brightness,
onPressed: ()=>windowManager.minimize()
),
isMax ? WindowCaptionButton.unmaximize(
brightness: Theme.of(context).brightness,
onPressed: ()=>windowManager.unmaximize()
) : WindowCaptionButton.maximize(
brightness: Theme.of(context).brightness,
onPressed: ()=>windowManager.maximize()
),
WindowCaptionButton.close(
brightness: Theme.of(context).brightness,
onPressed: ()=>windowManager.close()
),
],
),
],
),
),
],
);
}
}