[flutter_tools] Don't stringify null values in EventPrinter (#76579)

diff --git a/packages/flutter_tools/lib/src/test/event_printer.dart b/packages/flutter_tools/lib/src/test/event_printer.dart
index ca90f75..30ac915 100644
--- a/packages/flutter_tools/lib/src/test/event_printer.dart
+++ b/packages/flutter_tools/lib/src/test/event_printer.dart
@@ -22,7 +22,7 @@
   @override
   void handleStartedDevice(Uri observatoryUri) {
     _sendEvent('test.startedProcess',
-        <String, dynamic>{'observatoryUri': observatoryUri.toString()});
+        <String, dynamic>{'observatoryUri': observatoryUri?.toString()});
     _parent?.handleStartedDevice(observatoryUri);
   }
 
diff --git a/packages/flutter_tools/test/general.shard/test/event_printer_test.dart b/packages/flutter_tools/test/general.shard/test/event_printer_test.dart
index 4d5af99..37f6b4b 100644
--- a/packages/flutter_tools/test/general.shard/test/event_printer_test.dart
+++ b/packages/flutter_tools/test/general.shard/test/event_printer_test.dart
@@ -11,15 +11,48 @@
 import '../../src/common.dart';
 
 void main() {
-  testWithoutContext('EventPrinter handles a null parent', () {
-    final EventPrinter eventPrinter = EventPrinter(out: StringBuffer());
-    final _Device device = _Device();
+  group(EventPrinter, () {
     final Uri observatoryUri = Uri.parse('http://localhost:1234');
+    EventPrinter eventPrinter;
+    StringBuffer output;
 
-    expect(() => eventPrinter.handleFinishedTest(device), returnsNormally);
-    expect(() => eventPrinter.handleStartedDevice(observatoryUri), returnsNormally);
-    expect(() => eventPrinter.handleTestCrashed(device), returnsNormally);
-    expect(() => eventPrinter.handleTestTimedOut(device), returnsNormally);
+    setUp(() {
+      output = StringBuffer();
+      eventPrinter = EventPrinter(out: output);
+    });
+
+    testWithoutContext('handles a null parent', () {
+      final _Device device = _Device();
+
+      expect(() => eventPrinter.handleFinishedTest(device), returnsNormally);
+      expect(() => eventPrinter.handleStartedDevice(observatoryUri), returnsNormally);
+      expect(() => eventPrinter.handleTestCrashed(device), returnsNormally);
+      expect(() => eventPrinter.handleTestTimedOut(device), returnsNormally);
+    });
+
+    group('handleStartedDevice', () {
+      testWithoutContext('with non-null observatory', () {
+        eventPrinter.handleStartedDevice(observatoryUri);
+
+        expect(
+          output.toString(),
+          '\n'
+          '[{"event":"test.startedProcess","params":{"observatoryUri":"http://localhost:1234"}}]'
+          '\n',
+        );
+      });
+
+      testWithoutContext('with null observatory', () {
+        eventPrinter.handleStartedDevice(null);
+
+        expect(
+          output.toString(),
+          '\n'
+          '[{"event":"test.startedProcess","params":{"observatoryUri":null}}]'
+          '\n',
+        );
+      });
+    });
   });
 }