このプラグインを使用すると、フラッターデスクトップアプリがウィンドウを変更および再配置することができます。
英語| 简体中文
macos windowsmacos windowswindowswindowswindowswindowsmacosmacosmacos windowsmacos windowswindowsmacos windowsmacos windowslinux windowsmacos windowswindowsmacosmacosmacosmacos windowsmacos windowslinux windowslinuxlinuxmacos windowsmacos windowswindowswindows| Linux | macos | Windows |
|---|---|---|
| ✔✔️ | ✔✔️ | ✔✔️ |
これをパッケージの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
}
}Hide Methodを使用する必要がある場合は、 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()
}); onWindowFocusイベントでsetState 1回電話してください。
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を返します - ウィンドウが最大化されているかどうか。
ウィンドウを最大化します。 Aero Snapをverticallyシミュレートし、Windowsでのみ動作します
ウィンドウを最大化しません。
boolを返します - ウィンドウが最小化されるかどうか。
ウィンドウを最小化します。一部のプラットフォームでは、最小化されたウィンドウがドックに表示されます。
最小化状態から前の状態に窓を復元します。
boolを返します - ウィンドウがフルスクリーンモードであるかどうか。
ウィンドウがフルスクリーンモードであるかどうかを設定します。
windows boolを返します - ウィンドウがドッキング可能かどうか。
windows 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すべてのワークスペースにウィンドウが表示されるかどうかを設定します。
注:別の画面のフルスクリーンウィンドウの上にウィンドウのドラッグをサポートする必要がある場合は、NSPANELから継承するためにMainFlutterWindowを変更する必要があります
class MainFlutterWindow : NSPanel {
// ...
} macosタスクバー(ドック)アプリのアイコンにラベルを設定/設定します
appdelegate.swiftのようにアクセスを要求する必要があることに注意してください:anusternotificationcenter.current()。requestauthorization(options:[.alert、.badge]))
macos windows boolを返します - 窓に影があるかどうか。 Windowsでは、ウィンドウがフレームレスでない限り、常にTRUEを返します。
macos windows窓に影があるかどうかを設定します。 Windowsでは、ウィンドウがフレームレスでない限り、何もしません。
double -0.0(完全に透明)と1.0(完全に不透明)を返します。
ウィンドウの不透明度を設定します。
ウィンドウの明るさを設定します。
窓にすべてのマウスイベントを無視させます。
このウィンドウで発生したすべてのマウスイベントは、このウィンドウの下のウィンドウに渡されますが、このウィンドウに焦点が合っている場合、キーボードイベントが表示されます。
指定されたマウスダウンイベントに基づいて、ウィンドウドラッグを開始します。
linux windows指定されたマウスダウン&マウスモーブイベントに基づいて、サイズの窓を開始します。
linuxキーボードをつかみます。
linuxキーボードをつかみません。
窓が閉じられるときに放出されます。
ウィンドウが焦点を当てたときに放出されます。
窓が焦点を失ったときに放出されます。
ウィンドウが最大化されると放出されます。
最大化された状態から窓が終了すると放出されます。
ウィンドウが最小化されたときに放出されます。
最小化された状態からウィンドウが復元されたときに放出されます。
窓がサイズ変更された後に放出されます。
macos windows窓がサイズ変更されたときに一度放出されます。
窓が新しい位置に移動されているときに放出されます。
macos windows窓が新しい位置に移動されたときに一度放出されます。
ウィンドウがフルスクリーン状態に入ると放出されます。
窓が全画面状態を離れると放出されます。
windows窓がドックされた状態に入ったときに放出されました。
windows窓がドックされた状態を離れると放出されます。
すべてのイベントを放出しました。
| 貢献を追加します |
mit