18

How can I run my flutter app on multiple devices at the same time without having to go through the sequential procedure of: select a device -> run, select other device -> run, etc.?

Using: Android Studio 3.2.1 Flutter 1.0.0 Dart 2.1.0

Oliver Metz
  • 2,712
  • 2
  • 20
  • 32

4 Answers4

39

Run command in terminal:

flutter run -d all 

or create a script (e.g. runall.sh in root):

#!/usr/bin/env bash
flutter run -d all

and go to "Run" -> "Edit Configurations". Press "+" in upper left corner -> select "Bash". Then set:

  • Name: runall
  • Script: [path to runall.sh script]
  • Interpreter Path: /bin/bash

Select "runall" instead of "main.dart" beside run icon. Performing run (also through shortcut) will now run app on all devices.

Drawback: You'll have to enter "r" followed by Enter in run terminal for hot reload. Icon and shortcut does not work. Hot reload is performed on all devices though.

Just a workaround for now. I'm pretty sure the flutter plugin will cover this soon.

Oliver Metz
  • 2,712
  • 2
  • 20
  • 32
12

There are many ways to do this as previously answered. If you use VS Code instead of Android Studio as your Flutter IDE, this is how you can use the VSC launch configuration and tasks to run concurrently from a single launch and have hot reload enabled for all devices.

If you have an issue with executing flutter run -d all this is an alternative solution will which let you specify the devices that should run. Ensure that the devices you specify are available when running flutter devices.

Your current launch.json file may look something like this:

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

Setup

You will need to update this launch.json file and create tasks.json in the same .vscode folder that is in your application's root directory.

Application folder file structure once the VSC config files are created

Paste only the below code into 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",
        }
    ],
}

Paste only the below code into 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' "
    }
  ]
}

Replace the device names accordingly ('iPhone 11', 'AOSP on IA Emulator', 'Chrome').

Firing up all devices

Press the F5 key.

And you're done.

If the F5 shortcut to Start Debugging does not work for you, navigate to Debug & Run on the side panel and select the Flutter-All Configuration you've just created and then Run.

Debug & Run Menu > Configuration Selection

You will then see the terminal window appear and will able to switch between the individual hot-reload sessions running (as Tasks in their own shell).

Individual Terminal Sessions with each Flutter Device running concurrently

Some Background

We use 'Compound Tasks' by way of the dependsOn option on a Task and not 'Compounds' which are for Configurations.

As it is not possible to launch Configurations concurrently, only sequentially, we use tasks which can run concurrently.

Hence, the "Flutter-All" Configuration executes the tasks of the iOS, Android and Web Configurations.

If using Compounds, a Configuration will need to complete before the next runs which is not what we want. With Tasks we can choose to execute them sequentially however by default they will execute concurrently when using the dependsOn option.

//Do not use this unless you want to use Configurations only by testing them sequentially and not tasks
"compounds": [
    {
        "name": "Flutter-All",
        "configurations": ["Flutter-iOS", "Flutter-Android", "Flutter-Web"],
    }
]
Darshan Kassen
  • 645
  • 7
  • 19
1

If you don't want to use the command line directly each time, you can do the following workaround:

  1. Download bashsupport plugin (link)
  2. Create new configuration of bash, leave the script field empty, and in the interperter options cell insert:flutter run -d all. It should look something like: enter image description here
  3. If step two didn't work, create a file call something like run_all.sh in your root project. and put the next lines there(assuming that bin/bash is the path to your bash):

    #!/bin/bash flutter run -d all

    type in your terminal:chmod 755 run_all.sh.

    Specify run_all.sh in your configuration and bin/bash as your interprter path. Remove flutter run -d all from interperter options.

    It should look something like: enter image description here

yshahak
  • 4,996
  • 1
  • 31
  • 37
0

You can always have an external tool watch the files for you and trigger a hot reload.

Flutter supports certain signals to trigger a hot reload natively

  --pid-file  Specify a file to write the process id to. You can send SIGUSR1 to trigger a hot reload and SIGUSR2 to trigger a hot restart.

Here is an fast example:

#!/usr/bin/env bash

set -euo pipefail

# Remove previous pid files
rm -f /tmp/flutter.pid

# Run in a loop a hot reload call in a subshell
(while true
do
    # Wait for flutter to start before monitoring pid
    while [[ ! -f /tmp/flutter.pid ]]; do sleep 1; done;

    # Send hot reload signal when files change
    find lib/ -name '*.dart' | entr -n -d -p kill -USR1 $(cat /tmp/flutter.pid)
done) &

# Run all devices under 1 pid
flutter run -d all --pid-file /tmp/flutter.pid

Idea from: https://medium.com/@kikap/how-to-automatically-hot-reload-flutter-when-dart-source-files-change-6e8fdb523004

For more details on entr: http://eradman.com/entrproject/entr.1.html

trcarden
  • 881
  • 1
  • 9
  • 17