Reland "Clean up some flutter_tools tests and roll dependencies" (#33225)

This relands flutter/flutter#33163 with a fix to the integration_ui test.
diff --git a/packages/flutter_tools/lib/src/devfs.dart b/packages/flutter_tools/lib/src/devfs.dart
index bcc6e59..e15fb5c 100644
--- a/packages/flutter_tools/lib/src/devfs.dart
+++ b/packages/flutter_tools/lib/src/devfs.dart
@@ -7,7 +7,6 @@
 import 'package:meta/meta.dart';
 
 import 'asset.dart';
-import 'base/common.dart';
 import 'base/context.dart';
 import 'base/file_system.dart';
 import 'base/io.dart';
@@ -268,7 +267,6 @@
   final Uri httpAddress;
 
   static const int kMaxInFlight = 6;
-  static const int kMaxRetries = 3;
 
   int _inFlight = 0;
   Map<Uri, DevFSContent> _outstanding;
@@ -284,19 +282,17 @@
   }
 
   void _scheduleWrites() {
-    while (_inFlight < kMaxInFlight) {
-      if (_outstanding.isEmpty) {
-        // Finished.
-        break;
-      }
+    while ((_inFlight < kMaxInFlight) && (!_completer.isCompleted) && _outstanding.isNotEmpty) {
       final Uri deviceUri = _outstanding.keys.first;
       final DevFSContent content = _outstanding.remove(deviceUri);
-      _scheduleWrite(deviceUri, content);
-      _inFlight++;
+      _startWrite(deviceUri, content);
+      _inFlight += 1;
     }
+    if ((_inFlight == 0) && (!_completer.isCompleted) && _outstanding.isEmpty)
+      _completer.complete();
   }
 
-  Future<void> _scheduleWrite(
+  Future<void> _startWrite(
     Uri deviceUri,
     DevFSContent content, [
     int retry = 0,
@@ -305,33 +301,19 @@
       final HttpClientRequest request = await _client.putUrl(httpAddress);
       request.headers.removeAll(HttpHeaders.acceptEncodingHeader);
       request.headers.add('dev_fs_name', fsName);
-      request.headers.add('dev_fs_uri_b64',
-          base64.encode(utf8.encode(deviceUri.toString())));
+      request.headers.add('dev_fs_uri_b64', base64.encode(utf8.encode('$deviceUri')));
       final Stream<List<int>> contents = content.contentsAsCompressedStream();
       await request.addStream(contents);
       final HttpClientResponse response = await request.close();
       await response.drain<void>();
-    } on SocketException catch (socketException, stackTrace) {
-      // We have one completer and can get up to kMaxInFlight errors.
-      if (!_completer.isCompleted)
-        _completer.completeError(socketException, stackTrace);
-      return;
-    } catch (e) {
-      if (retry < kMaxRetries) {
-        printTrace('Retrying writing "$deviceUri" to DevFS due to error: $e');
-        // Synchronization is handled by the _completer below.
-        unawaited(_scheduleWrite(deviceUri, content, retry + 1));
-        return;
-      } else {
-        printError('Error writing "$deviceUri" to DevFS: $e');
+    } catch (error, trace) {
+      if (!_completer.isCompleted) {
+        printTrace('Error writing "$deviceUri" to DevFS: $error');
+        _completer.completeError(error, trace);
       }
     }
-    _inFlight--;
-    if ((_outstanding.isEmpty) && (_inFlight == 0)) {
-      _completer.complete();
-    } else {
-      _scheduleWrites();
-    }
+    _inFlight -= 1;
+    _scheduleWrites();
   }
 }