Always show diagnostics (#57532)
diff --git a/packages/flutter_tools/lib/src/commands/devices.dart b/packages/flutter_tools/lib/src/commands/devices.dart
index 312e82a..dafe884 100644
--- a/packages/flutter_tools/lib/src/commands/devices.dart
+++ b/packages/flutter_tools/lib/src/commands/devices.dart
@@ -60,34 +60,39 @@
if (boolArg('machine')) {
await printDevicesAsJson(devices);
- } else if (devices.isEmpty) {
- final StringBuffer status = StringBuffer('No devices detected.');
- status.writeln();
- status.writeln();
- status.writeln('Run "flutter emulators" to list and start any available device emulators.');
- status.writeln();
- status.write('If you expected your device to be detected, please run "flutter doctor" to diagnose potential issues. ');
- if (timeout == null) {
- status.write('You may also try increasing the time to wait for connected devices with the --timeout flag. ');
- }
- status.write('Visit https://flutter.dev/setup/ for troubleshooting tips.');
-
- globals.printStatus(status.toString());
- final List<String> diagnostics = await deviceManager.getDeviceDiagnostics();
- if (diagnostics.isNotEmpty) {
- globals.printStatus('');
- for (final String diagnostic in diagnostics) {
- globals.printStatus('• $diagnostic', hangingIndent: 2);
- }
- }
} else {
- globals.printStatus('${devices.length} connected ${pluralize('device', devices.length)}:\n');
- await Device.printDevices(devices);
- }
+ if (devices.isEmpty) {
+ final StringBuffer status = StringBuffer('No devices detected.');
+ status.writeln();
+ status.writeln();
+ status.writeln('Run "flutter emulators" to list and start any available device emulators.');
+ status.writeln();
+ status.write('If you expected your device to be detected, please run "flutter doctor" to diagnose potential issues. ');
+ if (timeout == null) {
+ status.write('You may also try increasing the time to wait for connected devices with the --timeout flag. ');
+ }
+ status.write('Visit https://flutter.dev/setup/ for troubleshooting tips.');
+ globals.printStatus(status.toString());
+ } else {
+ globals.printStatus('${devices.length} connected ${pluralize('device', devices.length)}:\n');
+ await Device.printDevices(devices);
+ }
+ await _printDiagnostics();
+ }
return FlutterCommandResult.success();
}
+ Future<void> _printDiagnostics() async {
+ final List<String> diagnostics = await deviceManager.getDeviceDiagnostics();
+ if (diagnostics.isNotEmpty) {
+ globals.printStatus('');
+ for (final String diagnostic in diagnostics) {
+ globals.printStatus('• $diagnostic', hangingIndent: 2);
+ }
+ }
+ }
+
Future<void> printDevicesAsJson(List<Device> devices) async {
globals.printStatus(
const JsonEncoder.withIndent(' ').convert(
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/devices_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/devices_test.dart
index 32cafe1..b2d1404 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/devices_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/devices_test.dart
@@ -84,6 +84,25 @@
DeviceManager: () => _FakeDeviceManager(),
ProcessManager: () => MockProcessManager(),
});
+
+ testUsingContext('available devices and diagnostics', () async {
+ final DevicesCommand command = DevicesCommand();
+ await createTestCommandRunner(command).run(<String>['devices']);
+ expect(
+ testLogger.statusText,
+ '''
+2 connected devices:
+
+ephemeral • ephemeral • android-arm • Test SDK (1.2.3) (emulator)
+webby • webby • web-javascript • Web SDK (1.2.4) (emulator)
+
+• Cannot connect to device ABC
+'''
+ );
+ }, overrides: <Type, Generator>{
+ DeviceManager: () => _FakeDeviceManager(),
+ ProcessManager: () => MockProcessManager(),
+ });
});
}
@@ -126,4 +145,8 @@
Future<List<Device>> refreshAllConnectedDevices({Duration timeout}) =>
getAllConnectedDevices();
+ @override
+ Future<List<String>> getDeviceDiagnostics() => Future<List<String>>.value(
+ <String>['Cannot connect to device ABC']
+ );
}