Fix getDevicesById() (#9646)

If the user specified a non-exact device id, it was producing
an exception whereby we were trying to listen to the
`getAllConnectedDevies()` stream twice.
diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart
index 7ba2299..b356690 100644
--- a/packages/flutter_tools/lib/src/device.dart
+++ b/packages/flutter_tools/lib/src/device.dart
@@ -53,7 +53,7 @@
   bool get hasSpecifiedAllDevices => _specifiedDeviceId == 'all';
 
   Stream<Device> getDevicesById(String deviceId) async* {
-    final Stream<Device> devices = getAllConnectedDevices();
+    final List<Device> devices = await getAllConnectedDevices().toList();
     deviceId = deviceId.toLowerCase();
     bool exactlyMatchesDeviceId(Device device) =>
         device.id.toLowerCase() == deviceId ||
@@ -62,15 +62,15 @@
         device.id.toLowerCase().startsWith(deviceId) ||
         device.name.toLowerCase().startsWith(deviceId);
 
-    final Device exactMatch = await devices.firstWhere(
-        exactlyMatchesDeviceId, defaultValue: () => null);
+    final Device exactMatch = devices.firstWhere(
+        exactlyMatchesDeviceId, orElse: () => null);
     if (exactMatch != null) {
       yield exactMatch;
       return;
     }
 
     // Match on a id or name starting with [deviceId].
-    await for (Device device in devices.where(startsWithDeviceId))
+    for (Device device in devices.where(startsWithDeviceId))
       yield device;
   }