Refactor: app window logic (#1842)

* feat: add TargetPlatform `isDesktop` helper

Safe and convenient way to check if the current platform is a desktop platform.

* refactor: move window logic to separate class

This is much cleaner and better encapsulated. Sets up an area for
further window management in the future.

Does not try to initialize on mobile or web, which would crash.

* fix: isDesktop doc comment

* fix: set window title

Currently only displays "app_flowy" as the window title. This commit
sets the window title to "AppFlowy" as part of the init process.
This commit is contained in:
Kristen McWilliam 2023-02-11 01:16:38 -05:00 committed by GitHub
parent 8588afcda6
commit 6c895ad4fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 52 additions and 13 deletions

View File

@ -0,0 +1 @@
export 'target_platform.dart';

View File

@ -0,0 +1,11 @@
import 'package:flutter/foundation.dart' show TargetPlatform;
extension TargetPlatformHelper on TargetPlatform {
/// Convenience function to check if the app is running on a desktop computer.
///
/// Easily check if on desktop by checking `defaultTargetPlatform.isDesktop`.
bool get isDesktop =>
this == TargetPlatform.linux ||
this == TargetPlatform.macOS ||
this == TargetPlatform.windows;
}

View File

@ -1,11 +1,11 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:hotkey_manager/hotkey_manager.dart';
import 'package:window_manager/window_manager.dart';
import 'startup/launch_configuration.dart';
import 'startup/startup.dart';
import 'user/presentation/splash_screen.dart';
import 'window/window.dart';
class FlowyApp implements EntryPoint {
@override
@ -21,19 +21,8 @@ Future<void> main() async {
await EasyLocalization.ensureInitialized();
await hotKeyManager.unregisterAll();
await windowManager.ensureInitialized();
await setWindowOptions();
await AppWindow.initialize();
await FlowyRunner.run(FlowyApp());
}
Future<void> setWindowOptions() async {
WindowOptions windowOptions = const WindowOptions(
minimumSize: Size(600, 400),
);
return windowManager.waitUntilReadyToShow(windowOptions, () async {
await windowManager.show();
await windowManager.focus();
});
}

View File

@ -0,0 +1,37 @@
import 'dart:ui';
import 'package:app_flowy/core/helpers/helpers.dart';
import 'package:flutter/foundation.dart';
import 'package:window_manager/window_manager.dart';
/// Represents the main window of the app.
class AppWindow {
/// The singleton instance of the window.
static late AppWindow instance;
AppWindow._() {
instance = this;
}
/// Initializes the window.
static Future<AppWindow?> initialize() async {
// Don't initialize on mobile or web.
if (!defaultTargetPlatform.isDesktop) {
return null;
}
await windowManager.ensureInitialized();
WindowOptions windowOptions = const WindowOptions(
minimumSize: Size(600, 400),
title: 'AppFlowy',
);
await windowManager.waitUntilReadyToShow(windowOptions, () async {
await windowManager.show();
await windowManager.focus();
});
return AppWindow._();
}
}

View File

@ -0,0 +1 @@
export 'app_window.dart';