@@ -26,6 +26,7 @@ import '../project.dart';
2626import '../resident_runner.dart' ;
2727import '../runner/flutter_command.dart' ;
2828import '../runner/flutter_command_runner.dart' ;
29+ import '../web/web_device.dart' ;
2930import '../widget_preview/analytics.dart' ;
3031import '../widget_preview/dependency_graph.dart' ;
3132import '../widget_preview/dtd_services.dart' ;
@@ -137,6 +138,12 @@ final class WidgetPreviewStartCommand extends WidgetPreviewSubCommandBase with C
137138 }
138139 addPubOptions ();
139140 argParser
141+ ..addFlag (
142+ kWebServer,
143+ help:
144+ 'Serve the widget preview environment using the web-server device instead of the '
145+ 'browser.' ,
146+ )
140147 ..addFlag (
141148 kLaunchPreviewer,
142149 defaultsTo: true ,
@@ -150,12 +157,14 @@ final class WidgetPreviewStartCommand extends WidgetPreviewSubCommandBase with C
150157 help:
151158 'Generated the widget preview environment scaffolding at a given location '
152159 'for testing purposes.' ,
160+ hide: ! verbose,
153161 );
154162 }
155163
156164 static const kWidgetPreviewScaffoldName = 'widget_preview_scaffold' ;
157165 static const kLaunchPreviewer = 'launch-previewer' ;
158166 static const kHeadless = 'headless' ;
167+ static const kWebServer = 'web-server' ;
159168 static const kWidgetPreviewScaffoldOutputDir = 'scaffold-output-dir' ;
160169
161170 /// Environment variable used to pass the DTD URI to the widget preview scaffold.
@@ -358,16 +367,28 @@ final class WidgetPreviewStartCommand extends WidgetPreviewSubCommandBase with C
358367
359368 Future <int > runPreviewEnvironment ({required FlutterProject widgetPreviewScaffoldProject}) async {
360369 try {
361- // Since the only target supported by the widget preview scaffold is the web
362- // device, only a single web device should be returned.
363- final List <Device > devices = await deviceManager! .getDevices (
364- filter: DeviceDiscoveryFilter (
365- supportFilter: DeviceDiscoverySupportFilter .excludeDevicesUnsupportedByFlutterOrProject (
366- flutterProject: widgetPreviewScaffoldProject,
370+ final List <Device > devices;
371+ if (boolArg (kWebServer)) {
372+ try {
373+ // The web-server device is hidden by default, make it visible before trying to look it up.
374+ WebServerDevice .showWebServerDevice = true ;
375+ devices = await deviceManager! .getDevicesById (WebServerDevice .kWebServerDeviceId);
376+ } finally {
377+ // Reset the flag to false to avoid affecting other commands.
378+ WebServerDevice .showWebServerDevice = false ;
379+ }
380+ } else {
381+ // Since the only target supported by the widget preview scaffold is the web
382+ // device, only a single web device should be returned.
383+ devices = await deviceManager! .getDevices (
384+ filter: DeviceDiscoveryFilter (
385+ supportFilter: DeviceDiscoverySupportFilter .excludeDevicesUnsupportedByFlutterOrProject (
386+ flutterProject: widgetPreviewScaffoldProject,
387+ ),
388+ deviceConnectionInterface: DeviceConnectionInterface .attached,
367389 ),
368- deviceConnectionInterface: DeviceConnectionInterface .attached,
369- ),
370- );
390+ );
391+ }
371392 assert (devices.length == 1 );
372393 final Device device = devices.first;
373394
0 commit comments