Flutter多窗口管理插件desktop_multi_window的使用

Flutter多窗口管理插件desktop_multi_window的使用

插件简介

Pub

desktop_multi_window 是一个Flutter插件,允许开发者在桌面应用中创建和管理多个窗口。该插件支持Windows、Linux和macOS平台。

平台 支持情况
Windows
Linux
macOS

使用方法

添加依赖

要在项目中使用这个插件,需要在 pubspec.yaml 文件中添加 desktop_multi_window 作为依赖项:

dependencies:
  desktop_multi_window: ^latest_version

请将 ^latest_version 替换为 Pub 上最新发布的版本号。

创建并显示新窗口

下面的代码展示了如何创建一个新的子窗口,并设置其位置、大小和标题等属性。

import 'package:desktop_multi_window/desktop_multi_window.dart';

// 创建新窗口
final window = await DesktopMultiWindow.createWindow(jsonEncode({
  'args1': 'Sub window',
  'args2': 100,
  'args3': true,
  'business': 'business_test',
}));

// 设置窗口的位置、大小、居中显示、标题并显示窗口
window
  ..setFrame(const Offset(0, 0) & const Size(1280, 720))
  ..center()
  ..setTitle('Another window')
  ..show();

调用远程窗口方法

由于每个窗口运行在一个独立的Flutter引擎实例上,因此我们需要使用 DesktopMultiWindow.setMethodCallHandlerDesktopMultiWindow.invokeMethod 来处理不同窗口之间的方法调用。

设置方法调用处理器

DesktopMultiWindow.setMethodCallHandler((call, fromWindowId) async {
  debugPrint('${call.method} ${call.arguments} $fromWindowId');
  return "result";
});

调用远程窗口的方法

final result =
    await DesktopMultiWindow.invokeMethod(windowId!, "method_name", "arguments");
debugPrint("onSend result: $result");

示例代码

以下是一个完整的示例程序,演示了如何使用 desktop_multi_window 插件来创建主窗口和子窗口,并在它们之间进行通信。

import 'dart:convert';
import 'package:collection/collection.dart';
import 'package:desktop_lifecycle/desktop_lifecycle.dart';
import 'package:desktop_multi_window/desktop_multi_window.dart';
import 'package:flutter/material.dart';
import 'event_widget.dart'; // 假设这是你自己的事件处理组件

void main(List<String> args) {
  if (args.firstOrNull == 'multi_window') {
    final windowId = int.parse(args[1]);
    final argument = args.length > 2 && args[2].isNotEmpty
        ? jsonDecode(args[2]) as Map<String, dynamic>
        : const {};
    runApp(_ExampleSubWindow(
      windowController: WindowController.fromWindowId(windowId),
      args: argument,
    ));
  } else {
    runApp(const _ExampleMainWindow());
  }
}

class _ExampleMainWindow extends StatefulWidget {
  const _ExampleMainWindow({Key? key}) : super(key: key);

  @override
  State<_ExampleMainWindow> createState() => _ExampleMainWindowState();
}

class _ExampleMainWindowState extends State<_ExampleMainWindow> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Column(
          children: [
            TextButton(
              onPressed: () async {
                final window =
                    await DesktopMultiWindow.createWindow(jsonEncode({
                  'args1': 'Sub window',
                  'args2': 100,
                  'args3': true,
                  'business': 'business_test',
                }));
                window
                  ..setFrame(const Offset(0, 0) & const Size(1280, 720))
                  ..center()
                  ..setTitle('Another window')
                  ..show();
              },
              child: const Text('Create a new World!'),
            ),
            TextButton(
              child: const Text('Send event to all sub windows'),
              onPressed: () async {
                final subWindowIds =
                    await DesktopMultiWindow.getAllSubWindowIds();
                for (final windowId in subWindowIds) {
                  DesktopMultiWindow.invokeMethod(
                    windowId,
                    'broadcast',
                    'Broadcast from main window',
                  );
                }
              },
            ),
            Expanded(
              child: EventWidget(controller: WindowController.fromWindowId(0)),
            )
          ],
        ),
      ),
    );
  }
}

class _ExampleSubWindow extends StatelessWidget {
  const _ExampleSubWindow({
    Key? key,
    required this.windowController,
    required this.args,
  }) : super(key: key);

  final WindowController windowController;
  final Map? args;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Column(
          children: [
            if (args != null)
              Text(
                'Arguments: ${args.toString()}',
                style: const TextStyle(fontSize: 20),
              ),
            ValueListenableBuilder<bool>(
              valueListenable: DesktopLifecycle.instance.isActive,
              builder: (context, active, child) {
                return Text(active ? 'Window Active' : 'Window Inactive');
              },
            ),
            TextButton(
              onPressed: () async {
                windowController.close();
              },
              child: const Text('Close this window'),
            ),
            Expanded(child: EventWidget(controller: windowController)),
          ],
        ),
      ),
    );
  }
}

在这个例子中,我们定义了一个主窗口 _ExampleMainWindow 和一个子窗口 _ExampleSubWindow。通过点击按钮可以创建新的子窗口或向所有子窗口发送广播消息。此外,还展示了如何传递参数给子窗口以及如何监听窗口的状态变化(如激活/非激活)。


更多关于Flutter多窗口管理插件desktop_multi_window的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter多窗口管理插件desktop_multi_window的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用desktop_multi_window插件进行多窗口管理的示例代码。这个插件允许你在桌面平台上(如Windows、macOS和Linux)创建和管理多个窗口。

首先,你需要在你的pubspec.yaml文件中添加desktop_multi_window依赖:

dependencies:
  flutter:
    sdk: flutter
  desktop_multi_window: ^0.4.0  # 请检查最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,你可以通过以下方式创建和管理多个窗口。

主窗口(main.dart)

import 'package:flutter/material.dart';
import 'package:desktop_multi_window/desktop_multi_window.dart';
import 'second_window.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Main Window'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 打开第二个窗口
              openSecondWindow();
            },
            child: Text('Open Second Window'),
          ),
        ),
      ),
    );
  }
}

void openSecondWindow() {
  // 使用DesktopWindow.create创建新窗口
  DesktopWindow.create(
    builder: (context) => SecondWindow(),
    windowName: 'Second Window',
    initialSize: Size(600, 400),
    resizable: true,
  );
}

第二个窗口(second_window.dart)

import 'package:flutter/material.dart';

class SecondWindow extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Second Window'),
        ),
        body: Center(
          child: Text('This is the second window!'),
        ),
      ),
    );
  }
}

注意事项

  1. 平台支持desktop_multi_window插件仅支持桌面平台(Windows、macOS和Linux)。在移动平台上,此插件将不起作用。

  2. 权限和配置:确保你的Flutter项目已经配置为支持桌面平台。你可能需要在flutter config中启用桌面平台支持,并在你的IDE中设置相应的运行配置。

  3. 窗口管理:除了创建窗口外,desktop_multi_window还提供了其他窗口管理方法,如关闭窗口、最小化窗口等。你可以查阅官方文档获取更多信息。

通过上述代码,你应该能够在Flutter桌面应用中成功创建和管理多个窗口。希望这对你有所帮助!

回到顶部