Remove writelnStderr (#16058)

Paying off technical debt...
diff --git a/packages/flutter_tools/lib/runner.dart b/packages/flutter_tools/lib/runner.dart
index b755ffb..4ef89ca 100644
--- a/packages/flutter_tools/lib/runner.dart
+++ b/packages/flutter_tools/lib/runner.dart
@@ -61,17 +61,6 @@
   });
 }
 
-/// Writes the [string] to one of the standard output streams.
-@visibleForTesting
-typedef void WriteCallback([String string]);
-
-/// Writes a line to STDERR.
-///
-/// Overwrite this in tests to avoid spurious test output.
-// TODO(tvolkert): Remove this in favor of context[Stdio]
-@visibleForTesting
-WriteCallback writelnStderr = stderr.writeln;
-
 Future<int> _handleToolError(
     dynamic error,
     StackTrace stackTrace,
@@ -81,9 +70,9 @@
     String getFlutterVersion(),
     ) async {
   if (error is UsageException) {
-    writelnStderr(error.message);
-    writelnStderr();
-    writelnStderr(
+    stderr.writeln(error.message);
+    stderr.writeln();
+    stderr.writeln(
         "Run 'flutter -h' (or 'flutter <command> -h') for available "
             'flutter commands and options.'
     );
@@ -91,11 +80,11 @@
     return _exit(64);
   } else if (error is ToolExit) {
     if (error.message != null)
-      writelnStderr(error.message);
+      stderr.writeln(error.message);
     if (verbose) {
-      writelnStderr();
-      writelnStderr(stackTrace.toString());
-      writelnStderr();
+      stderr.writeln();
+      stderr.writeln(stackTrace.toString());
+      stderr.writeln();
     }
     return _exit(error.exitCode ?? 1);
   } else if (error is ProcessExit) {
@@ -108,20 +97,20 @@
     }
   } else {
     // We've crashed; emit a log report.
-    writelnStderr();
+    stderr.writeln();
 
     if (!reportCrashes) {
       // Print the stack trace on the bots - don't write a crash report.
-      writelnStderr('$error');
-      writelnStderr(stackTrace.toString());
+      stderr.writeln('$error');
+      stderr.writeln(stackTrace.toString());
       return _exit(1);
     } else {
       flutterUsage.sendException(error, stackTrace);
 
       if (error is String)
-        writelnStderr('Oops; flutter has exited unexpectedly: "$error".');
+        stderr.writeln('Oops; flutter has exited unexpectedly: "$error".');
       else
-        writelnStderr('Oops; flutter has exited unexpectedly.');
+        stderr.writeln('Oops; flutter has exited unexpectedly.');
 
       await CrashReportSender.instance.sendReport(
         error: error,
@@ -130,13 +119,13 @@
       );
       try {
         final File file = await _createLocalCrashReport(args, error, stackTrace);
-        writelnStderr(
+        stderr.writeln(
           'Crash report written to ${file.path};\n'
               'please let us know at https://github.com/flutter/flutter/issues.',
         );
         return _exit(1);
       } catch (error) {
-        writelnStderr(
+        stderr.writeln(
           'Unable to generate crash report due to secondary error: $error\n'
               'please let us know at https://github.com/flutter/flutter/issues.',
         );
diff --git a/packages/flutter_tools/test/crash_reporting_test.dart b/packages/flutter_tools/test/crash_reporting_test.dart
index cb77182..004b326 100644
--- a/packages/flutter_tools/test/crash_reporting_test.dart
+++ b/packages/flutter_tools/test/crash_reporting_test.dart
@@ -30,13 +30,11 @@
 
     setUp(() async {
       tools.crashFileSystem = new MemoryFileSystem();
-      tools.writelnStderr = ([_]) { };
       setExitFunctionForTests((_) { });
     });
 
     tearDown(() {
       tools.crashFileSystem = const LocalFileSystem();
-      tools.writelnStderr = const Stdio().stderr.writeln;
       restoreExitFunction();
     });
 
@@ -119,6 +117,8 @@
             .map((FileSystemEntity e) => e.path).toList();
       expect(writtenFiles, hasLength(1));
       expect(writtenFiles, contains('flutter_01.log'));
+    }, overrides: <Type, Generator>{
+      Stdio: () => const _NoStderr(),
     });
   });
 }
@@ -149,3 +149,50 @@
     fn3();
   }
 }
+
+class _NoStderr extends Stdio {
+  const _NoStderr();
+
+  @override
+  IOSink get stderr => const _NoopIOSink();
+}
+
+class _NoopIOSink implements IOSink {
+  const _NoopIOSink();
+
+  @override
+  Encoding get encoding => utf8;
+
+  @override
+  set encoding(_) => throw new UnsupportedError('');
+
+  @override
+  void add(_) {}
+
+  @override
+  void write(_) {}
+
+  @override
+  void writeAll(_, [__]) {}
+
+  @override
+  void writeln([_]) {}
+
+  @override
+  void writeCharCode(_) {}
+
+  @override
+  void addError(_, [__]) {}
+
+  @override
+  Future<dynamic> addStream(_) async {}
+
+  @override
+  Future<dynamic> flush() async {}
+
+  @override
+  Future<dynamic> close() async {}
+
+  @override
+  Future<dynamic> get done async {}
+}