@@ -16,9 +16,11 @@ import '../base/logger.dart';
16
16
import '../base/os.dart' ;
17
17
import '../base/platform.dart' ;
18
18
import '../base/process.dart' ;
19
+ import '../base/terminal.dart' ;
19
20
import '../build_info.dart' ;
20
21
import '../bundle.dart' as bundle;
21
22
import '../cache.dart' ;
23
+ import '../convert.dart' ;
22
24
import '../device.dart' ;
23
25
import '../globals.dart' as globals;
24
26
import '../isolated/resident_web_runner.dart' ;
@@ -116,7 +118,7 @@ abstract base class WidgetPreviewSubCommandBase extends FlutterCommand {
116
118
final class WidgetPreviewStartCommand extends WidgetPreviewSubCommandBase with CreateBase {
117
119
WidgetPreviewStartCommand ({
118
120
this .verbose = false ,
119
- required this . logger,
121
+ required Logger logger,
120
122
required this .fs,
121
123
required this .projectFactory,
122
124
required this .cache,
@@ -126,11 +128,12 @@ final class WidgetPreviewStartCommand extends WidgetPreviewSubCommandBase with C
126
128
required this .processManager,
127
129
required this .artifacts,
128
130
@visibleForTesting WidgetPreviewDtdServices ? dtdServicesOverride,
129
- }) {
131
+ }) : logger = WidgetPreviewMachineAwareLogger (logger) {
130
132
if (dtdServicesOverride != null ) {
131
133
_dtdService = dtdServicesOverride;
132
134
}
133
135
addPubOptions ();
136
+ addMachineOutputFlag (verboseHelp: verbose);
134
137
argParser
135
138
..addFlag (
136
139
kWebServer,
@@ -189,7 +192,7 @@ final class WidgetPreviewStartCommand extends WidgetPreviewSubCommandBase with C
189
192
final FileSystem fs;
190
193
191
194
@override
192
- final Logger logger;
195
+ final WidgetPreviewMachineAwareLogger logger;
193
196
194
197
@override
195
198
final FlutterProjectFactory projectFactory;
@@ -255,6 +258,9 @@ final class WidgetPreviewStartCommand extends WidgetPreviewSubCommandBase with C
255
258
? fs.directory (customPreviewScaffoldOutput)
256
259
: rootProject.widgetPreviewScaffold;
257
260
261
+ final bool machine = boolArg (FlutterGlobalOptions .kMachineFlag);
262
+ logger.machine = machine;
263
+
258
264
// Check to see if a preview scaffold has already been generated. If not,
259
265
// generate one.
260
266
final bool generateScaffoldProject =
@@ -444,6 +450,7 @@ final class WidgetPreviewStartCommand extends WidgetPreviewSubCommandBase with C
444
450
);
445
451
unawaited (_widgetPreviewApp! .run (appStartedCompleter: appStarted));
446
452
await appStarted.future;
453
+ logger.sendEvent ('started' , {'url' : flutterDevice.devFS! .baseUri.toString ()});
447
454
}
448
455
} on Exception catch (error) {
449
456
throwToolExit (error.toString ());
@@ -491,3 +498,145 @@ final class WidgetPreviewCleanCommand extends WidgetPreviewSubCommandBase {
491
498
return FlutterCommandResult .success ();
492
499
}
493
500
}
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