Этот плагин позволяет Flutter Desktop Apps для изменения размера и перемещения окна.
Английский | 简体中文
macos windowsmacos windowswindowswindows Iscockedwindowswindowsmacosmacosmacos windowsmacos windowswindowsmacos windowsmacos windowslinux windowsmacos windowswindowsmacosmacosmacosmacos windowsmacos windowslinux windowslinuxlinuxmacos windowsmacos windowswindowswindows| Linux | macOS | Окна |
|---|---|---|
| ✔ | ✔ | ✔ |
Добавьте это в файл pubspec.yaml от вашего пакета:
dependencies :
window_manager : ^0.4.2Или
dependencies :
window_manager :
git :
url : https://github.com/leanflutter/window_manager.git
ref : main import 'package:flutter/material.dart' ;
import 'package:window_manager/window_manager.dart' ;
void main () async {
WidgetsFlutterBinding . ensureInitialized ();
// Must add this line.
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 ());
}
Пожалуйста, смотрите пример приложения этого плагина для полного примера.
import 'package:flutter/cupertino.dart' ;
import 'package:window_manager/window_manager.dart' ;
class HomePage extends StatefulWidget {
@override
_HomePageState createState () => _HomePageState ();
}
class _HomePageState extends State < HomePage > with WindowListener {
@override
void initState () {
super . initState ();
windowManager. addListener ( this );
}
@override
void dispose () {
windowManager. removeListener ( this );
super . dispose ();
}
@override
Widget build ( BuildContext context) {
// ...
}
@override
void onWindowEvent ( String eventName) {
print ( '[WindowManager] onWindowEvent: $ eventName ' );
}
@override
void onWindowClose () {
// do something
}
@override
void onWindowFocus () {
// do something
}
@override
void onWindowBlur () {
// do something
}
@override
void onWindowMaximize () {
// do something
}
@override
void onWindowUnmaximize () {
// do something
}
@override
void onWindowMinimize () {
// do something
}
@override
void onWindowRestore () {
// do something
}
@override
void onWindowResize () {
// do something
}
@override
void onWindowMove () {
// do something
}
@override
void onWindowEnterFullScreen () {
// do something
}
@override
void onWindowLeaveFullScreen () {
// do something
}
} Если вам нужно использовать метод скрыть, вам нужно отключить QuitOnClose .
Измените файл macos/Runner/AppDelegate.swift следующим образом:
import Cocoa
import FlutterMacOS
@NSApplicationMain
class AppDelegate: FlutterAppDelegate {
override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
- return true
+ return false
}
} import 'package:flutter/cupertino.dart' ;
import 'package:window_manager/window_manager.dart' ;
class HomePage extends StatefulWidget {
@override
_HomePageState createState () => _HomePageState ();
}
class _HomePageState extends State < HomePage > with WindowListener {
@override
void initState () {
super . initState ();
windowManager. addListener ( this );
_init ();
}
@override
void dispose () {
windowManager. removeListener ( this );
super . dispose ();
}
void _init () async {
// Add this line to override the default close handler
await windowManager. setPreventClose ( true );
setState (() {});
}
@override
Widget build ( BuildContext context) {
// ...
}
@override
void onWindowClose () async {
bool _isPreventClose = await windowManager. isPreventClose ();
if (_isPreventClose) {
showDialog (
context : context,
builder : (_) {
return AlertDialog (
title : Text ( 'Are you sure you want to close this window?' ),
actions : [
TextButton (
child : Text ( 'No' ),
onPressed : () {
Navigator . of (context). pop ();
},
),
TextButton (
child : Text ( 'Yes' ),
onPressed : () {
Navigator . of (context). pop ();
await windowManager. destroy ();
},
),
],
);
},
);
}
}
} Измените файл linux/my_application.cc следующим образом:
...
// Implements GApplication::activate.
static void my_application_activate(GApplication* application) {
...
gtk_window_set_default_size(window, 1280, 720);
- gtk_widget_show(GTK_WIDGET(window));
+ gtk_widget_realize(GTK_WIDGET(window));
g_autoptr(FlDartProject) project = fl_dart_project_new();
fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);
FlView* view = fl_view_new(project);
gtk_widget_show(GTK_WIDGET(view));
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));
fl_register_plugins(FL_PLUGIN_REGISTRY(view));
gtk_widget_grab_focus(GTK_WIDGET(view));
}
...
Измените файл macos/Runner/MainFlutterWindow.swift следующим образом:
import Cocoa
import FlutterMacOS
+ import window_manager
class MainFlutterWindow: NSWindow {
override func awakeFromNib() {
let flutterViewController = FlutterViewController.init()
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/runner/win32_window.cpp следующим образом:
bool Win32Window::CreateAndShow(const std::wstring& title,
const Point& origin,
const Size& size) {
...
HWND window = CreateWindow(
- window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
+ window_class, title.c_str(),
+ WS_OVERLAPPEDWINDOW, // do not add WS_VISIBLE since the window will be shown later
Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),
Scale(size.width, scale_factor), Scale(size.height, scale_factor),
nullptr, nullptr, GetModuleHandle(nullptr), this); Поскольку Flutter 3.7 Новый проект Windows изменить файл windows/runner/flutter_window.cpp следующим образом:
bool FlutterWindow::OnCreate() {
...
flutter_controller_->engine()->SetNextFrameCallback([&]() {
- this->Show();
+ "" //delete this->Show()
}); Обязательно позвоните setState один раз на событии onWindowFocus .
import 'package:flutter/cupertino.dart' ;
import 'package:window_manager/window_manager.dart' ;
class HomePage extends StatefulWidget {
@override
_HomePageState createState () => _HomePageState ();
}
class _HomePageState extends State < HomePage > with WindowListener {
@override
void initState () {
super . initState ();
windowManager. addListener ( this );
}
@override
void dispose () {
windowManager. removeListener ( this );
super . dispose ();
}
@override
Widget build ( BuildContext context) {
// ...
}
@override
void onWindowFocus () {
// Make sure to call once.
setState (() {});
// do something
}
}
Подождите, пока не будет готов показать.
Заставляйте закрыть окно.
Попробуйте закрыть окно.
Проверьте, перехватывает ли нативный сигнал закрытия.
Установите, если перехватить нативный сигнал закрытия. Может полезно при сочетании со слушателем событий Onclose. Это также предотвратит вручную, запускаемое близкое событие.
Фокусируется на окне.
macos windowsУдаляет фокус из окна.
macos windows Возвращает bool - сосредоточено ли окно.
Показывает и уделяет фокус окну.
Скрывает окно.
Возвращает bool - виден ли окно пользователю.
Возвращает bool - максимизировано окно.
Максимизирует окно. vertically имитирует Aero Snap, работает только в Windows
НЕПРАВИЛЬНЫЙ ОКНА.
Возвращает bool - министр окна.
Минимизирует окно. На некоторых платформах минимизированное окно будет показано в доке.
Восстанавливает окно из минимизированного состояния до его предыдущего состояния.
Возвращает bool - будь то окно в полноэкранном режиме.
Устанавливает, должно ли окно быть в полноэкранном режиме.
windows Возвращает bool - будь то окно пристыковано или нет.
windows Iscocked Возвращает bool - будь то окно.
windowsСтавит окно. Работает только на Windows
windowsОткрывает окно. Работает только на Windows
Это заставит окно поддерживать соотношение сторон.
Устанавливает цвет фона окна.
Переместите окно в положение, выровненное с экраном.
Перемещает окно к центру экрана.
Возвращает Rect - границы окна в качестве объекта.
Изменения и перемещает окно к поставленным границам.
Возвращает Size - содержит ширину и высоту окна.
Сбросит размер окна до width и height .
Возвращает Offset - содержит текущую позицию окна.
Перемещает окно в положение.
Устанавливает минимальный размер окна на width и height .
Устанавливает максимальный размер окна на width и height .
Возвращает bool - может ли окно быть изменено вручную.
Устанавливает, может ли окно быть изменено пользователем вручную.
macos Возвращает bool - может ли окно быть перенесенным пользователем.
macosУстанавливает, можно ли перемещать окно пользователем.
macos windows Возвращает bool - может ли окно быть минимизировано вручную пользователем.
macos windowsУстанавливает, может ли окно быть минимизировано вручную пользователем.
windows Возвращает bool - может ли окно быть вручную закрыто пользователем.
macos windows Возвращает bool - может ли окно быть вручную максимизировано пользователем.
Устанавливает, может ли окно быть максимизировано вручную пользователем.
macos windowsУстанавливает, может ли окно быть вручную закрыто пользователем.
Возвращает bool - всегда ли окно наверху других окон.
Устанавливает, всегда ли окно отображаться всегда поверх других окон.
Возвращает bool - всегда ли окно под другими окнами.
linux windowsУстанавливает, всегда ли окно отображаться всегда ниже других окон.
Возвращает String - заголовок нативного окна.
Изменит заголовок нативного окна на заголовок.
Изменит стиль заголовка стиля нативного окна.
Возвращает int - высота полоса заголовка нативного окна.
Возвращает bool - включена ли панель задач.
Делает окно не показывать на панели задач / док -станции.
macos windowsУстанавливает стоимость прогресса в панели хода. Допустимый диапазон [0, 1.0].
windowsУстанавливает значок окна/панели задач.
macos Возвращает bool - виден ли окно во всех рабочих пространствах.
macosУстанавливает, должно ли окно быть видно во всех рабочих пространствах.
ПРИМЕЧАНИЕ. Если вам нужно поддерживать перетаскивание окна поверх полноэкранного окна на другом экране, вам нужно изменить MainflutterWindow, чтобы наследовать от NSPAnel
class MainFlutterWindow : NSPanel {
// ...
} macosУстановить/unset метки на значке приложения (док -док)
Обратите внимание, что необходимо запросить доступ к вашему appdelegate.swift
macos windows Возвращает bool - есть ли у окна тень. В Windows всегда возвращает True, если окно не является безвозвратным.
macos windowsУстанавливает, должна ли у окна тень. В Windows ничего не делает, если окно не беспрепятственно.
Возвращает double - между 0,0 (полностью прозрачным) до 1,0 (полностью непрозрачный).
Устанавливает непрозрачность окна.
Устанавливает яркость окна.
Заставляет окно игнорировать все события мыши.
Все события мыши, произошедшие в этом окне, будут переданы в окно под этим окном, но если это окно имеет фокус, оно все равно будет получать события клавиатуры.
Запускает перетаскивание окна на основе указанного события мыши.
linux windowsЗапускает изменение размера окна на основе указанного события мыши-паутины и мышью.
linuxЗахватывает клавиатуру.
linuxНе заброшены клавиатуру.
Испускается, когда окно будет закрыто.
Испускается, когда окно получает фокус.
Испускается, когда окно теряет фокус.
Излучается, когда окно максимизируется.
Испускается, когда окно выходит из максимизированного состояния.
Испускается, когда окно сведено к минимуму.
Испускается, когда окно восстанавливается из минимизированного состояния.
Излучается после того, как окно было изменено.
macos windowsИзлучается один раз, когда окно закончилось изменением размера.
Испускается, когда окно перемещается на новую позицию.
macos windowsИзлучается один раз, когда окно перемещается на новую позицию.
Испускается, когда окно входит в полноэкранное состояние.
Испускается, когда окно оставляет полноэкранное состояние.
windowsИзлучается, когда окно вошло в пристыкованное состояние.
windowsИспускается, когда окно оставляет пристыкованное состояние.
Испускал все события.
| Добавьте свой вклад |
Грань