이 플러그인을 사용하면 Flut
영어 | 简体中文
macos windowsmacos windowswindowswindowswindowswindowsmacosmacosmacos windowsmacos windowswindowsmacos windowsmacos windowslinux windowsmacos windowswindowsmacosmacosmacosmacos windowsmacos windowslinux windows Startresizinglinuxlinuxmacos windowsmacos windowswindowswindows| 리눅스 | 마코스 | 창 |
|---|---|---|
| ✔️ | ✔️ | ✔️ |
패키지의 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()
}); onWindowFocus 이벤트에서 setState 한 번 전화하십시오.
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 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작업 표시 줄 (Dock) 앱 아이콘에서 설정/UNSET 레이블을 설정합니다
다음과 같이 AppDelegate.swift에서 액세스를 요청해야합니다. UnuserNotificationCenter.current (). requestAuthorization (옵션 : [.Alert, .badge]).
macos windows bool 반환합니다 - 창에 그림자가 있는지 여부. Windows에서는 창이 프레임이 없으면 항상 사실을 반환합니다.
macos windows창에 그림자가 있어야하는지 여부를 설정합니다. Windows에서는 창이 프레임이 없으면 아무것도하지 않습니다.
리턴을 double - 0.0 (완전히 투명)과 1.0 (완전히 불투명) 사이에서 반환합니다.
창의 불투명도를 설정합니다.
창의 밝기를 설정합니다.
창이 모든 마우스 이벤트를 무시하게합니다.
이 창에서 발생한 모든 마우스 이벤트는이 창 아래의 창으로 전달되지만이 창에 초점이 맞으면 키보드 이벤트가 여전히 수신됩니다.
지정된 마우스 다운 이벤트를 기반으로 창 드래그를 시작합니다.
linux windows Startresizing지정된 마우스 다운 및 마우스 움직임 이벤트에 따라 창 크기를 시작합니다.
linux키보드를 잡습니다.
linux키보드를 풀습니다.
창을 닫을 때 방출됩니다.
창이 초점을 맞출 때 방출됩니다.
창이 초점을 잃으면 방출됩니다.
창이 최대화 될 때 방출됩니다.
창이 최대 상태에서 나올 때 방출됩니다.
창을 최소화 할 때 방출됩니다.
창이 최소화 된 상태에서 회복 될 때 방출됩니다.
창이 크기가 커진 후 방출됩니다.
macos windows창이 크기가 완료되었을 때 한 번 방출됩니다.
창이 새 위치로 이동할 때 방출됩니다.
macos windows창이 새 위치로 이동하면 한 번 방출됩니다.
창이 전체 화면 상태로 들어갈 때 방출됩니다.
창문이 전체 화면 상태를 떠날 때 방출됩니다.
windows창이 도킹 된 상태에 들어갔을 때 방출됩니다.
windows창문이 도킹 된 상태를 떠날 때 방출됩니다.
모든 이벤트를 방출했습니다.
| 기여를 추가하십시오 |
MIT