首页 > 系统相关 >flutter windows使用多窗口方法

flutter windows使用多窗口方法

时间:2023-09-30 19:55:52浏览次数:36  
标签:多窗口 窗口 windows required id width height flutter

最近研究flutter在Windows和MacOs操作系统上使用多窗口方法,总结一下开发心得。

众所周知,flutter使用skia将像素点,通过opengl,software,metal等方式渲染到一个窗口上,不像原生开发的可以指定控件添加到具体窗口内。

在flutter pub仓库管理中,看了几个大神写的多窗口方案,无一例外都是通过加载多个flutter engine实例,即一个窗口一个flutter engine实例创建多窗口,

通过底层(c++,swift)使用EventSink实现两个窗口之间通讯,使用这种方式无需改动flutter engine源码,集成多窗口plugin开发即可,

但这个方案同样存在几个问题:

1.加载新窗口时间过长:创建多个窗口时,需要加载一个新的dart vm环境,同时创建一个新的flutter engine对象,创建新的窗口需要等待几秒,如果在7代i5的设备上,

甚至长达10秒左右。

2.窗口之间数据共享复杂:创建新的窗口,主窗口需要将数据传输到新窗口,一旦两个窗口之间数据通讯越来越多,对于后期开发来说,简直是个灾难。

3.增加内存开销:前面说了,每个窗口之间创建需要重新创建一个dart vm,就是要加载一个新的dart源码文件,一个空的flutter demo的源码so文件,

就有10多m,加载到内存中占多100m。

 

针对以上几个问题,我下载了flutter engine的源码进行小修改,使其更加简单开发。

先看看dart中我的创建新窗口思路源码:

class MyWindow {
  final WindowID id;
  final String title;
  late SingletonFlutterWindow subwindow;
  double width;
  double height;
  int x;
  int y;

  late WindowEventListener listener;

  MyWindow(
      {required this.title,
      required this.id,
      this.width = 1280,
      this.height = 720,
      this.x = 0,
      this.y = 0,
      bool bMaximize = false}) {
    MultiWindow.create(
            title: title,
            id: id.index,
            width: width,
            height: height,
            x: x,
            y: y,
            bMaximize: bMaximize)
        .then((value) {
      if (value == true) {
        Timer.run(
          () {
            //要等窗口大小回来
            onCreateWindowSuccess();
          },
        );

        listener.addEventListener();
      }
    });
    listener = WindowEventListener(id.index);
  }

  void onCreateWindowSuccess() {
    subwindow =
        SingletonFlutterWindow(this.id.index, PlatformDispatcher.instance);
    WidgetsFlutterBinding widgetsBinding =
        WidgetsFlutterBinding(bindingWindow: subwindow);
    WindowManager.instance.setCurWidgetBinding(widgetsBinding);
    widgetsBinding.scheduleAttachRootWidget(build());
    widgetsBinding.scheduleWarmUpFrame();
  }

  Widget build() {
    return Container();
  }
}

新窗口继承MyWindow,

import 'package:flutter/material.dart';
import 'package:flutter_app/UI/BaseWindow/MyWindow.dart';

class DemoWindow extends MyWindow {
  String key = "";
  DemoWindow(
      {required String title,
      required WindowID id,
      required double width,
      required double height,
      required int x,
      required int y,
      required bool bMaximize})
      : super(
            title: title,
            id: id,
            width: width,
            height: height,
            x: x,
            y: y,
            bMaximize: bMaximize) {
    key = "chart${id.index}";
  }

  @override
  Widget build() {
    return MaterialApp(home: DemoWindowHome(this));
  }
}

class DemoWindowHome extends StatefulWidget {
  DemoWindow window;

  DemoWindowHome(this.window);

  @override
  State<DemoWindowHome> createState() => _DemoWindowHomeState();
}

class _DemoWindowHomeState extends State<DemoWindowHome> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        backgroundColor: Colors.blue,
        body: Center(
            child: Column(
          children: [
            Container(
                width: 200, height: 100, color: Colors.red, child: TextField()),
            MaterialButton(
              onPressed: () {},
              child: Text("sec wind"),
            )
          ],
        )));
  }
}

只要调用

DemoWindow newWindow =  DemoWindow();

这样在一个dart创建中,就能创建一个新的窗口了,并且可以使用现有窗口的环境的数据,而且打开新的窗口的时间更原生几乎一样。

转载请注明出处,from博客园HemoJohn,有偿指导加q:980550823

标签:多窗口,窗口,windows,required,id,width,height,flutter
From: https://www.cnblogs.com/HemJohn/p/17738145.html

相关文章

  • taskhostw.exe是Windows操作系统中的一个系统进程,主要作用是支持并调用Windows任务计
    taskhostw.exe是Windows操作系统中的一个系统进程,主要作用是支持并调用Windows任务计划程序。当您在计算机上创建或修改计划任务时,taskhostw.exe会启动并运行相应的任务。常见的任务计划包括备份、系统检查、磁盘清理等等。通过设置计划任务,可以让计算机在特定时间或事件发生时自......
  • (system)ntoskrnl.exe是Windows操作系统的内核文件之一,也是整个操作系统的核心部分
    ntoskrnl.exe是Windows操作系统的内核文件之一,也是整个操作系统的核心部分。它被称为WindowsNT操作系统内核,是操作系统中最重要、最基础的部分之一。ntoskrnl.exe主要负责管理和控制计算机的各种硬件资源,包括处理器、内存、磁盘、输入输出设备等等。ntoskrnl.exe是操作系统启动......
  • smartscreen.exe是Windows操作系统中的一个进程,它是Windows Defender SmartScreen的一
    smartscreen.exe是Windows操作系统中的一个进程,它是WindowsDefenderSmartScreen的一部分。WindowsDefenderSmartScreen是Windows操作系统的一项安全功能,旨在帮助保护计算机免受恶意软件和不信任的应用程序的攻击。smartscreen.exe的作用是对正在运行的应用程序、下载的文件以......
  • DeviceCensus.exe是Windows操作系统中的一个进程,它与设备普查相关
    DeviceCensus.exe是Windows操作系统中的一个进程,它与设备普查相关。设备普查是Windows操作系统收集和报告硬件和软件信息的一项功能。具体来说,DeviceCensus.exe是Windows的设备普查服务的主执行文件。它负责定期运行设备普查任务,收集系统的硬件配置、驱动程序信息、应用程序使用情......
  • windows&linux共享
    优点:可以使用VS直接编辑linux跨平台代码apt-getinstallsambavim/etc/samba/smb.conf[code]//名称path=/code//路径writeable=yesbrowseable=yesguestok=yespkillsmbdsmbd//启动ps//显示当前终端的进程ps-ef|grepsmbd//|表示管道的输出;grep是过滤mk......
  • Flutter/Dart第04天:Dart异步编程(Future和async/await)
    Dart官网代码实验室:https://dart.dev/codelabs/async-await重要说明:本博客基于Dart官网代码实验室,但并不是简单的对官网文章进行翻译,我会根据个人研发经验,在覆盖官网文章核心内容情况下,加入自己的一些扩展问题和问题演示和总结,包括名称解释、使用场景说明、代码样例覆盖、最后完......
  • windows10 安装wsl2
     https://deepinout.com/wsl-tutorials/37_installing_wsl2_on_windows_10.htmlwin10安装wsl2WSL(WindowsSubsystemforLinux)是Windows10中一项十分强大的功能,它可以使用户在Windows系统上直接运行Linux系统,并且两个系统之间可以相互通信。而在WSL2中,Windows子......
  • 7、Windows应急响应
    Windows应急响应一、概述近年来,随着互联网的发展网络安全攻击事件也是大幅度增多,如何在第一时间发现攻击事件,并实施应急处置,能够有效的将损失降到最低。在实施应急响应的过程中,需要从多方面进行联动工作,具体的流程和依据可以参考《GB∕T38645-2020信息安全技术网络安全事件应......
  • Windows下SSH配置多账号
    C:\Users\Administrator\.ssh目录下新建config文件config文件内容如下配置了两个账号,举例如下#githubHostgithub.comHostNamegithub.comIdentityFile~/.ssh/github_id_rsaPreferredAuthenticationspublickey#giteeHostgitee.comHostNamegitee.comIdentityFile~/......
  • Windows 每天定时执行 bat 脚本
    创建包含如下内容的bat文件:forfiles/p"."/s/m*.temp*/d-31/c"cmd/cdel@file"它会删除当前路径下的所有以.temp结尾的超过31天的旧文件(详见bat删除当前路径指定天数前的旧文件)。现在想每天中午12点定时执行该文件:打开任务计划程序选择左侧任务计划......