Flutter Hot Reload 到多个设备

Posted

技术标签:

【中文标题】Flutter Hot Reload 到多个设备【英文标题】:Flutter Hot Reload to multiple devices 【发布时间】:2019-01-11 03:33:44 【问题描述】:

是否可以通过热重载连接多个设备? 具体来说,同时支持 androidios 模拟器。

【问题讨论】:

我认为不可能同时进行热重载。 欢迎来到 Stack Overflow。你能推测吗?这个问题没有分析,也没有讨论已经尝试过的内容。 How To Ask.但一般来说,请不要问不能表明任何努力寻找解决方案的单行问题。 @Elletlar 我一般同意。但在他的问题范围内,实际上,没有必要提供更多信息。 @farhana 我找到了它,它非常简单......只需在调试模式下运行......在所有设备上。它会在两者上重新加载 - 注意我使用 VS Code @Elletlar @Rémi Rousselet 好的,谢谢兄弟的信息 【参考方案1】:

这适用于我在 Android Studio 中:

    启动两个模拟器/连接设备

    使用flutter run -d all 运行您的代码

    r 热加载

【讨论】:

是的,我发现在终端或 vs 代码调试模式下有两种方法....thxs bro 请注意,最近它将尝试在 MacOS 和 Web 上运行。我找不到修复的解决方案。 您可以在 Flutter 安装的配置中禁用 macOS 和 Web。这样它就不会调试它们。或者临时重命名项目根目录中的“macos”和“web”文件夹。 多iOS模拟器坏了,需要安卓。【参考方案2】:

如果您使用 VS Code 作为 Flutter IDE,您可以使用 VSC 启动配置和任务从单次启动并发运行,并为所有设备启用热重载。

如果您在执行 flutter run -d all 时遇到问题,这是一种替代解决方案,可让您指定应运行的设备。 确保您指定的设备在运行flutter devices 时可用。

您当前的launch.json 文件可能如下所示:


    "version": "0.2.0",
    "configurations": [
        
            "name": "Flutter",
            "type": "dart",
            "request": "launch",
            "flutterMode": "debug"        
        
    ]

设置

您需要更新此 launch.json 文件并在应用程序根目录中的同一 .vscode 文件夹中创建 tasks.json

仅将以下代码粘贴到launch.json


    "version": "0.2.0",
    "configurations": [
        
            "name": "Flutter-All",
            "preLaunchTask": "Flutter-Launch-All",
            "type": "dart",
        ,
        
            "name": "Flutter-iOS",
            "preLaunchTask": "Flutter-Launch-iOS",
            "type": "dart",
        ,
        
            "name": "Flutter-Android",
            "preLaunchTask": "Flutter-Launch-Android",
            "type": "dart",
        ,
        
            "name": "Flutter-Web",
            "preLaunchTask": "Flutter-Launch-Web",
            "type": "dart",
        
    ],

仅将以下代码粘贴到tasks.json


  "version": "2.0.0",
  "tasks": [
    
      "label": "Flutter-Launch-All",
      "dependsOn": [
        "Flutter-Launch-iOS",
        "Flutter-Launch-Android",
        "Flutter-Launch-Web"
      ]
    ,
    
      "label": "Flutter-Launch-iOS",
      "type": "shell",
      "command": "flutter run -d 'iPhone 11' "
    ,
    
      "label": "Flutter-Launch-Android",
      "type": "shell",
      "command": "flutter run -d 'AOSP on IA Emulator' "
    ,
    
      "label": "Flutter-Launch-Web",
      "type": "shell",
      "command": "flutter run -d 'Chrome' "
    
  ]

相应地替换设备名称('iPhone 11'、'AOSP on IA Emulator'、'Chrome')。

启动所有设备

按 F5 键。

你就完成了。

如果Start Debugging 的 F5 快捷方式对您不起作用,请导航至侧面板上的 Debug & Run 并选择您刚刚创建的 Flutter-All 配置,然后运行。

然后您将看到终端窗口出现,并且能够在运行的各个热重载会话之间切换(作为它们自己 shell 中的任务)。

一些背景

我们通过任务上的dependsOn 选项使用“复合任务”,而不是用于配置的“复合”。

由于不可能同时启动配置,只能按顺序启动,我们使用可以同时运行的任务。

因此,“Flutter-All”配置执行 iOS、Android 和 Web 配置的任务。

如果使用复合,则需要在下一次运行之前完成配置,这不是我们想要的。 对于任务,我们可以选择顺序执行它们,但默认情况下,当使用 dependsOn 选项时它们将同时执行。

//Do not use this in your launch.json file unless you want to debug one platform at a time.

"compounds": [
    
        "name": "Flutter-All",
        "configurations": ["Flutter-iOS", "Flutter-Android", "Flutter-Web"]
    
]

【讨论】:

我们可以用工作断点来做到这一点吗?我在顶部的 vscode 调试工具栏缺少带有 Flutter devtools 功能的“F”。 尚未对此进行测试,尽管您可以尝试将这些字段添加到配置中:__ "configurations": [ "name": "Flutter-All", "preLaunchTask": "Flutter-Launch-All ", "type": "dart", "request": "launch", "program": "lib/main.dart" ] "request": "attach" 而不是 "request": "launch"【参考方案3】:

在 Android Studio 中,如果您运行多台设备,run 菜单下有一个选项 Flutter hot reload (All Devices)

【讨论】:

谢谢,这正是我想要的 如何在多台设备上附加第一次运行?当我热重载“所有设备”时,只有最后一个得到重建【参考方案4】:

如果您尝试直接在 Visual Code 上加载它是行不通的,但只需几个步骤,您就可以使用 VS Code 或任何其他 IDE 进行编码,并在 IDE 之外热重新加载您的代码

    加载 iOS 模拟器 在终端中

    打开 -a 模拟器

    加载 Android 模拟器 在 Android Studio 中打开 ADV 并运行想要的模拟器

    打开一个终端来管理Android的热重载 在应用程序的文件夹中运行

    flutter run -d [ios-device-id]

    打开另一个终端来管理iOS的热重载 在应用程序的文件夹中,运行

    flutter run -d [android-device-id]

你会在两个终端看到:

? 要在运行时热重载更改,请按“r”。要热重启(和重建状态),请按“R”。

所以,此时只需更新您的代码,保存并在每个终端中按“r”,这不是同时进行的,但足以让两个模拟器同时打开并查看结果

【讨论】:

【参考方案5】:

要同时调试多个设备,您应该为设置了 deviceId 字段的每个设备设置启动配置(这与您传递给flutter run -d xxx) 的 ID 相同。通过单击 Debug -> Open Configurations 打开启动配置。添加底部的 compound 配置将同时启动两个(或更多)配置:


    "version": "0.2.0",
    "configurations": [
        
            "name": "Current Device",
            "request": "launch",
            "type": "dart"
        ,
        
            "name": "Android",
            "request": "launch",
            "type": "dart",
            "deviceId": "android"
        ,
        
            "name": "iPhone",
            "request": "launch",
            "type": "dart",
            "deviceId": "iphone"
        ,
    ],
    "compounds": [
        
            "name": "All Devices",
            "configurations": ["Android", "iPhone"],
        
    ]

保存后,复合配置将显示在调试侧栏顶部的下拉列表中。

Source

【讨论】:

【参考方案6】:

Android Studio Flutter:热重载多个设备

如果您正在运行 android 来构建您的 Flutter 应用程序,并且已经启动了多个设备或模拟器来预览您的 Flutter 应用程序(并且在 IDE 下方有相应的“运行”选项卡),您可能会发现保存项目只是热的- 重新加载其中一个实例。

热重载多台设备键盘快捷键:查看运行菜单,查找一次热重载多台设备的键盘快捷键。

这些是 MacOS 上用于热重载和热重启多个设备的默认快捷方式。请注意 (所有设备) 变体。

【讨论】:

以上是关于Flutter Hot Reload 到多个设备的主要内容,如果未能解决你的问题,请参考以下文章

Android 的 Instant Run vs Flutter Hot Reload 和 React Native Hot Reload 的区别?

揭秘Flutter Hot Reload(基础篇)

Flutter“不能热加载(hot reload),热重载按钮灰色且无法点击”的解决方案

如何在 Hot Reload 上使用 Provider 维护 Flutter Global BloC 状态?

关于AndroidStudio的 Hot reload on save not working问题

Hot Reload 在 react-native android 中不起作用