@@ -16,9 +16,11 @@ import '../base/logger.dart';
1616import '../base/os.dart' ;
1717import '../base/platform.dart' ;
1818import '../base/process.dart' ;
19+ import '../base/terminal.dart' ;
1920import '../build_info.dart' ;
2021import '../bundle.dart' as bundle;
2122import '../cache.dart' ;
23+ import '../convert.dart' ;
2224import '../device.dart' ;
2325import '../globals.dart' as globals;
2426import '../isolated/resident_web_runner.dart' ;
@@ -116,7 +118,7 @@ abstract base class WidgetPreviewSubCommandBase extends FlutterCommand {
116118final class WidgetPreviewStartCommand extends WidgetPreviewSubCommandBase with CreateBase {
117119 WidgetPreviewStartCommand ({
118120 this .verbose = false ,
119- required this . logger,
121+ required Logger logger,
120122 required this .fs,
121123 required this .projectFactory,
122124 required this .cache,
@@ -126,11 +128,12 @@ final class WidgetPreviewStartCommand extends WidgetPreviewSubCommandBase with C
126128 required this .processManager,
127129 required this .artifacts,
128130 @visibleForTesting WidgetPreviewDtdServices ? dtdServicesOverride,
129- }) {
131+ }) : logger = WidgetPreviewMachineAwareLogger (logger) {
130132 if (dtdServicesOverride != null ) {
131133 _dtdService = dtdServicesOverride;
132134 }
133135 addPubOptions ();
136+ addMachineOutputFlag (verboseHelp: verbose);
134137 argParser
135138 ..addFlag (
136139 kWebServer,
@@ -189,7 +192,7 @@ final class WidgetPreviewStartCommand extends WidgetPreviewSubCommandBase with C
189192 final FileSystem fs;
190193
191194 @override
192- final Logger logger;
195+ final WidgetPreviewMachineAwareLogger logger;
193196
194197 @override
195198 final FlutterProjectFactory projectFactory;
@@ -255,6 +258,9 @@ final class WidgetPreviewStartCommand extends WidgetPreviewSubCommandBase with C
255258 ? fs.directory (customPreviewScaffoldOutput)
256259 : rootProject.widgetPreviewScaffold;
257260
261+ final bool machine = boolArg (FlutterGlobalOptions .kMachineFlag);
262+ logger.machine = machine;
263+
258264 // Check to see if a preview scaffold has already been generated. If not,
259265 // generate one.
260266 final bool generateScaffoldProject =
@@ -444,6 +450,7 @@ final class WidgetPreviewStartCommand extends WidgetPreviewSubCommandBase with C
444450 );
445451 unawaited (_widgetPreviewApp! .run (appStartedCompleter: appStarted));
446452 await appStarted.future;
453+ logger.sendEvent ('started' , {'url' : flutterDevice.devFS! .baseUri.toString ()});
447454 }
448455 } on Exception catch (error) {
449456 throwToolExit (error.toString ());
@@ -491,3 +498,145 @@ final class WidgetPreviewCleanCommand extends WidgetPreviewSubCommandBase {
491498 return FlutterCommandResult .success ();
492499 }
493500}
501+
502+ /// A custom logger for the widget-preview commands that disables non-event output to stdio when
503+ /// machine mode is enabled.
504+ final class WidgetPreviewMachineAwareLogger extends DelegatingLogger {
505+ WidgetPreviewMachineAwareLogger (super .delegate);
506+
507+ var machine = false ;
508+
509+ @override
510+ void printError (
511+ String message, {
512+ StackTrace ? stackTrace,
513+ bool ? emphasis,
514+ TerminalColor ? color,
515+ int ? indent,
516+ int ? hangingIndent,
517+ bool ? wrap,
518+ }) {
519+ if (machine) {
520+ return ;
521+ }
522+ super .printError (
523+ message,
524+ stackTrace: stackTrace,
525+ emphasis: emphasis,
526+ color: color,
527+ indent: indent,
528+ hangingIndent: hangingIndent,
529+ wrap: wrap,
530+ );
531+ }
532+
533+ @override
534+ void printWarning (
535+ String message, {
536+ bool ? emphasis,
537+ TerminalColor ? color,
538+ int ? indent,
539+ int ? hangingIndent,
540+ bool ? wrap,
541+ bool fatal = true ,
542+ }) {
543+ if (machine) {
544+ return ;
545+ }
546+ super .printWarning (
547+ message,
548+ emphasis: emphasis,
549+ color: color,
550+ indent: indent,
551+ hangingIndent: hangingIndent,
552+ wrap: wrap,
553+ fatal: fatal,
554+ );
555+ }
556+
557+ @override
558+ void printStatus (
559+ String message, {
560+ bool ? emphasis,
561+ TerminalColor ? color,
562+ bool ? newline,
563+ int ? indent,
564+ int ? hangingIndent,
565+ bool ? wrap,
566+ }) {
567+ if (machine) {
568+ return ;
569+ }
570+ super .printStatus (
571+ message,
572+ emphasis: emphasis,
573+ color: color,
574+ newline: newline,
575+ indent: indent,
576+ hangingIndent: hangingIndent,
577+ wrap: wrap,
578+ );
579+ }
580+
581+ @override
582+ void printBox (String message, {String ? title}) {
583+ if (machine) {
584+ return ;
585+ }
586+ super .printBox (message, title: title);
587+ }
588+
589+ @override
590+ void printTrace (String message) {
591+ if (machine) {
592+ return ;
593+ }
594+ super .printTrace (message);
595+ }
596+
597+ @override
598+ void sendEvent (String name, [Map <String , dynamic >? args]) {
599+ if (! machine) {
600+ return ;
601+ }
602+ super .printStatus (
603+ json.encode ([
604+ {'event' : 'widget_preview.$name ' , 'params' : ? args},
605+ ]),
606+ );
607+ }
608+
609+ @override
610+ Status startProgress (
611+ String message, {
612+ String ? progressId,
613+ int progressIndicatorPadding = kDefaultStatusPadding,
614+ }) {
615+ if (machine) {
616+ return SilentStatus (stopwatch: Stopwatch ());
617+ }
618+ return super .startProgress (
619+ message,
620+ progressId: progressId,
621+ progressIndicatorPadding: progressIndicatorPadding,
622+ );
623+ }
624+
625+ @override
626+ Status startSpinner ({
627+ VoidCallback ? onFinish,
628+ Duration ? timeout,
629+ SlowWarningCallback ? slowWarningCallback,
630+ TerminalColor ? warningColor,
631+ }) {
632+ if (machine) {
633+ return SilentStatus (stopwatch: Stopwatch ());
634+ }
635+ return super .startSpinner (
636+ onFinish: onFinish,
637+ timeout: timeout,
638+ slowWarningCallback: slowWarningCallback,
639+ warningColor: warningColor,
640+ );
641+ }
642+ }
0 commit comments