Este plug -in permite que os aplicativos da Flutter Desktop redimensionem e reposicionem a janela.
Inglês | 简体中文
macos windowsmacos windowswindowswindowswindowswindowsmacos ismovablemacos setMovablemacos windowsmacos windowswindows isclosablemacos windowsmacos windowslinux windowsmacos windowswindows Seticonmacosmacosmacosmacos windowsmacos windowslinux windowslinuxlinuxmacos windowsmacos windowswindows OnWindowdockedwindows| Linux | macos | Windows |
|---|---|---|
| ✔️ | ✔️ | ✔️ |
Adicione isso ao arquivo pubspec.yaml do seu pacote:
dependencies :
window_manager : ^0.4.2Ou
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 ());
}
Consulte o aplicativo de exemplo deste plug -in para um exemplo completo.
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
}
} Se você precisar usar o método de oculto, precisará desativar QuitOnClose .
Altere o arquivo macos/Runner/AppDelegate.swift da seguinte forma:
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 ();
},
),
],
);
},
);
}
}
} Altere o arquivo linux/my_application.cc da seguinte forma:
...
// 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));
}
...
Altere o arquivo macos/Runner/MainFlutterWindow.swift da seguinte forma:
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()
+ }
}
Altere o arquivo windows/runner/win32_window.cpp da seguinte forma:
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); Como o Flutter 3.7 Novo Projeto Windows Altere o arquivo windows/runner/flutter_window.cpp da seguinte forma:
bool FlutterWindow::OnCreate() {
...
flutter_controller_->engine()->SetNextFrameCallback([&]() {
- this->Show();
+ "" //delete this->Show()
}); Certifique -se de ligar para setState uma vez no evento 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
}
}
Espere até pronto para mostrar.
Força fechando a janela.
Tente fechar a janela.
Verifique se está interceptando o sinal de fechamento nativo.
Defina se interceptar o sinal de fechamento nativo. Pode ser útil ao combinar com o ouvinte de eventos OCLOSE. Isso também impedirá o evento próximo desencadeado manualmente.
Concentra -se na janela.
macos windowsRemove o foco da janela.
macos windows Retorna bool - se a janela está focada.
Mostra e dá foco na janela.
Esconde a janela.
Retorna bool - se a janela está visível para o usuário.
Retorna bool - se a janela é maximizada.
Maximiza a janela. Simula vertically aero snap, só funciona no Windows
Improvisado a janela.
Retorna bool - se a janela é minimizada.
Minimiza a janela. Em algumas plataformas, a janela minimizada será mostrada no dock.
Restaura a janela do estado minimizado para o estado anterior.
Retorna bool - se a janela está no modo de tela cheia.
Define se a janela deve estar no modo de tela cheia.
windows Retorna bool - se a janela é dockable ou não.
windows Retorna bool - se a janela está ancorada.
windowsAberre a janela. Funciona apenas no Windows
windowsDescarga a janela. Funciona apenas no Windows
Isso fará com que uma janela mantenha uma proporção.
Define a cor de fundo da janela.
Mova a janela para uma posição alinhada com a tela.
Move a janela para o centro da tela.
Retorna Rect - os limites da janela como objeto.
Redimensiona e move a janela para os limites fornecidos.
Size do retorno - contém a largura e a altura da janela.
Redimensiona a janela para width e height .
Retorna Offset - Contém a posição atual da janela.
Move a janela para a posição.
Define o tamanho mínimo da janela para width e height .
Define o tamanho máximo da janela para width e height .
Retorna bool - se a janela pode ser redimensionada manualmente pelo usuário.
Define se a janela pode ser redimensionada manualmente pelo usuário.
macos ismovable Retorna bool - se a janela pode ser movida pelo usuário.
macos setMovableDefine se a janela pode ser movida pelo usuário.
macos windows Retorna bool - se a janela pode ser minimizada manualmente pelo usuário.
macos windowsDefine se a janela pode ser minimizada manualmente pelo usuário.
windows isclosable Retorna bool - se a janela pode ser fechada manualmente pelo usuário.
macos windows Retorna bool - Se a janela pode ser maximizada manualmente pelo usuário.
Define se a janela pode ser maximizada manualmente pelo usuário.
macos windowsDefine se a janela pode ser fechada manualmente pelo usuário.
Retorna bool - se a janela está sempre no topo de outras janelas.
Define se a janela deve ser exibida sempre no topo de outras janelas.
Retorna bool - se a janela está sempre abaixo de outras janelas.
linux windowsDefine se a janela deve ser exibida sempre abaixo de outras janelas.
Retorna String - o título da janela nativa.
Altera o título da janela nativa para o título.
Altera o estilo da barra de título da janela nativa.
Retorna int - a altura da barra de título da janela nativa.
Retorna bool - Se a barra de tarefas de pular está ativada.
Faz a janela não ser exibida na barra de tarefas / dock.
macos windowsDefine o valor do progresso na barra de progresso. O intervalo válido é [0, 1.0].
windows SeticonDefine o ícone de janela/barra de tarefas.
macos Retorna bool - se a janela é visível em todos os espaços de trabalho.
macosDefine se a janela deve ser visível em todos os espaços de trabalho.
Nota: Se você precisar suportar arrastar uma janela em cima de uma janela de tela cheia em outra tela, precisar
class MainFlutterWindow : NSPanel {
// ...
} macosSet/Unset Rótulo no ícone do aplicativo TaskBar (Dock)
Observe que é necessário solicitar acesso ao seu AppDelegate.swift como o seguinte: UnuserNotificationCenter.Current (). Request -Authorization (Opções: [.alert, .badge])
macos windows Retorna bool - se a janela tem uma sombra. No Windows, sempre retorna verdadeiro, a menos que a janela não tenha moldura.
macos windowsDefine se a janela deve ter uma sombra. No Windows, não faz nada a menos que a janela não tenha moldura.
Retorna double - entre 0,0 (totalmente transparente) e 1,0 (totalmente opaco).
Define a opacidade da janela.
Define o brilho da janela.
Faz a janela ignorar todos os eventos do mouse.
Todos os eventos do mouse aconteceram nesta janela serão passados para a janela abaixo desta janela, mas se essa janela tiver foco, ela ainda receberá eventos do teclado.
Inicia um arrasto de janela com base no evento especificado do mouse-down.
linux windowsInicia uma janela redimensiona com base no evento especificado de mouse-down e mouse-move.
linuxAgarra o teclado.
linuxUngrabs o teclado.
Emitido quando a janela será fechada.
Emitido quando a janela ganha foco.
Emitido quando a janela perde o foco.
Emitido quando a janela é maximizada.
Emitido quando a janela sai de um estado maximizado.
Emitido quando a janela é minimizada.
Emitido quando a janela é restaurada de um estado minimizado.
Emitido após a redação da janela.
macos windowsEmitido uma vez quando a janela terminar de ser redimensionada.
Emitido quando a janela está sendo movida para uma nova posição.
macos windowsEmitido uma vez quando a janela é movida para uma nova posição.
Emitido quando a janela entra em um estado de tela cheia.
Emitido quando a janela deixa um estado de tela cheia.
windows OnWindowdockedEmitido quando a janela entrou em um estado ancorado.
windowsEmitido quando a janela deixa um estado ancorado.
Emitiu todos os eventos.
| Adicione suas contribuições |
Mit