在 Flutter 窗口中设置最小/最大屏幕尺寸

Kha*_*dov 17 windows dart flutter

我正在开发一个 Windows flutter 应用程序。该应用程序已经有移动版本,我正在转换到 Windows。移动设计已经存在,但我需要将其转换为 Windows,问题是设计尚未准备好。

因此,我接到一项任务,找出如何为应用程序提供最大宽度和高度,以便用户无法使用鼠标更改应用程序屏幕尺寸。

有没有办法在 Flutter windows 上实现这个?

小智 25

是的,这是可以做到的,而且还避免了@Khamidjon Khamidov提到的问题。为此,您需要对 3 个文件进行更改:

  1. pubspec.yaml
  2. main.cpp(位于 windows\runner\main.cpp)
  3. 主程序.dart

将以下代码添加到 pubspec.yaml 的依赖项下并保存文件。

window_size:
    git:
      url: https://github.com/google/flutter-desktop-embedding
      path: plugins/window_size
Run Code Online (Sandbox Code Playgroud)

在main.cpp中更改以下代码:

Win32Window::Size size(1280, 720);
to
Win32Window::Size size(min_width, min_height)
Run Code Online (Sandbox Code Playgroud)

上面的代码将确保您的应用程序以首选大小启动。将 min_width 和 min_height 替换为您的最小值或最大值对。

修改你的 main.dart 如下所示:

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  if (Platform.isWindows || Platform.isLinux || Platform.isMacOS) {
    setWindowTitle('My App');
    setWindowMaxSize(const Size(max_width, max_height));
    setWindowMinSize(const Size(min_width, min_height));
  }

  runApp(const MyApp());
}
Run Code Online (Sandbox Code Playgroud)

将 max_width、max_height、min_width 和 min_height 替换为您的首选值。

注意:如果您想要一个不可调整大小的表单,请使用相同的最小值和最大值。

  • 更新:自 2022 年 3 月 15 日起,不再支持端口 9418 上的 git:// 协议。您可以使用 https:// 协议到 https://github.com/google/flutter-desktop-embedding.git (13认同)

小智 8

您可以使用此插件添加控制窗口实例的功能。

安装

将其添加到您的pubspec.yaml

dependencies:
  window_manager: ^0.2.7
Run Code Online (Sandbox Code Playgroud)

用法

在你的main()方法中添加:

dependencies:
  window_manager: ^0.2.7
Run Code Online (Sandbox Code Playgroud)

并将 1200 和 600 替换为您喜欢的尺寸。


Kha*_*dov 5

METHOD 1

正如@Stefano 提到的,我可以使用这个库:

dependencies:
  window_size:
    git:
      url: git://github.com/google/flutter-desktop-embedding.git
      path: plugins/window_size
Run Code Online (Sandbox Code Playgroud)

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:window_size/window_size.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  if (Platform.isWindows) {
    setWindowMaxSize(const Size(1024, 768));
    setWindowMinSize(const Size(512, 384));
    Future<Null>.delayed(Duration(seconds: 1), () {
        setWindowFrame(Rect.fromCenter(center: Offset(1000, 500), width: 600, height: 1000));
    });
  }
  runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)

但这里的问题是窗口大小被设置为默认值,因此它会在几秒钟后更改其大小。

METHOD 2

因为,第一种方法没有像我预期的那样工作,所以我混合了两种方法:

main.dart中:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  if (Platform.isWindows) {
    setWindowMaxSize(const Size(1024, 768));
    setWindowMinSize(const Size(512, 384));
  }
  runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)

lib/windows/runner/win32_window.cpp中: // 该方法已存在于文件中 bool Win32Window::CreateAndShow(const std::wstring& title, const Point& origin, const Size& size) { Destroy(); }

  const wchar_t* window_class =
      WindowClassRegistrar::GetInstance()->GetWindowClass();

  const POINT target_point = {static_cast<LONG>(/*x // change here to move to center*/ 550),  // before -> origin.x
                              static_cast<LONG>(/*y // change here to move vertically*/ origin.y)}; // before -> origin.y
  HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST);
  UINT dpi = FlutterDesktopGetDpiForMonitor(monitor);
  double scale_factor = dpi / 96.0;

  HWND window = CreateWindow(
      window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
      Scale(/* x // move to center */ 550, scale_factor), Scale(/* y // move screen vertically */ origin.y, scale_factor),// before -> origin.x, origin.y
      Scale(/* width  // set default width */ 450, scale_factor), Scale(/* height // set default height */ 800, scale_factor), // before -> size.width, size.height
      nullptr, nullptr, GetModuleHandle(nullptr), this);

  if (!window) {
    return false;
  }

  return OnCreate();
}
Run Code Online (Sandbox Code Playgroud)