diff --git a/packages/flutter_tools/lib/src/android/android_device.dart b/packages/flutter_tools/lib/src/android/android_device.dart
index c69d947..0d2a4e4 100644
--- a/packages/flutter_tools/lib/src/android/android_device.dart
+++ b/packages/flutter_tools/lib/src/android/android_device.dart
@@ -210,8 +210,8 @@
       // Sample output: '22'
       final String sdkVersion = await _getProperty('ro.build.version.sdk');
 
-      // ignore: deprecated_member_use
-      final int sdkVersionParsed = int.parse(sdkVersion, onError: (String source) => null);
+
+      final int sdkVersionParsed = int.tryParse(sdkVersion);
       if (sdkVersionParsed == null) {
         printError('Unexpected response from getprop: "$sdkVersion"');
         return false;
@@ -822,8 +822,8 @@
   final AndroidDevice device;
 
   static int _extractPort(String portString) {
-    // ignore: deprecated_member_use
-    return int.parse(portString.trim(), onError: (_) => null);
+
+    return int.tryParse(portString.trim());
   }
 
   @override
diff --git a/packages/flutter_tools/lib/src/asset.dart b/packages/flutter_tools/lib/src/asset.dart
index 9ee330c..26e8fd9 100644
--- a/packages/flutter_tools/lib/src/asset.dart
+++ b/packages/flutter_tools/lib/src/asset.dart
@@ -80,7 +80,7 @@
       return true;
 
     final FileStat stat = fs.file(manifestPath).statSync();
-    if (stat.type == FileSystemEntityType.NOT_FOUND) // ignore: deprecated_member_use
+    if (stat.type == FileSystemEntityType.notFound)
       return true;
 
     return stat.modified.isAfter(_lastBuildTimestamp);
diff --git a/packages/flutter_tools/lib/src/base/file_system.dart b/packages/flutter_tools/lib/src/base/file_system.dart
index ea918cd..a6f8c27 100644
--- a/packages/flutter_tools/lib/src/base/file_system.dart
+++ b/packages/flutter_tools/lib/src/base/file_system.dart
@@ -104,15 +104,15 @@
 Directory getRecordingSink(String dirname, String basename) {
   final String location = _kLocalFs.path.join(dirname, basename);
   switch (_kLocalFs.typeSync(location, followLinks: false)) {
-    case FileSystemEntityType.FILE: // ignore: deprecated_member_use
-    case FileSystemEntityType.LINK: // ignore: deprecated_member_use
+    case FileSystemEntityType.file:
+    case FileSystemEntityType.link:
       throwToolExit('Invalid record-to location: $dirname ("$basename" exists as non-directory)');
       break;
-    case FileSystemEntityType.DIRECTORY: // ignore: deprecated_member_use
+    case FileSystemEntityType.directory:
       if (_kLocalFs.directory(location).listSync(followLinks: false).isNotEmpty)
         throwToolExit('Invalid record-to location: $dirname ("$basename" is not empty)');
       break;
-    case FileSystemEntityType.NOT_FOUND: // ignore: deprecated_member_use
+    case FileSystemEntityType.notFound:
       _kLocalFs.directory(location).createSync(recursive: true);
   }
   return _kLocalFs.directory(location);
diff --git a/packages/flutter_tools/lib/src/base/io.dart b/packages/flutter_tools/lib/src/base/io.dart
index ed1531f..c09041f 100644
--- a/packages/flutter_tools/lib/src/base/io.dart
+++ b/packages/flutter_tools/lib/src/base/io.dart
@@ -41,7 +41,7 @@
         exitCode,
         // File              NO! Use `file_system.dart`
         // FileSystemEntity  NO! Use `file_system.dart`
-        GZIP, // ignore: deprecated_member_use
+        gzip,
         HandshakeException,
         HttpClient,
         HttpClientRequest,
@@ -71,7 +71,7 @@
         // stdout,           NO! Use `io.dart`
         Socket,
         SocketException,
-        SYSTEM_ENCODING, // ignore: deprecated_member_use
+        systemEncoding,
         WebSocket,
         WebSocketException,
         WebSocketTransformer;
diff --git a/packages/flutter_tools/lib/src/base/process.dart b/packages/flutter_tools/lib/src/base/process.dart
index 3f7507b..a3dca75 100644
--- a/packages/flutter_tools/lib/src/base/process.dart
+++ b/packages/flutter_tools/lib/src/base/process.dart
@@ -213,7 +213,7 @@
   _traceCommand(cmd);
   final Future<Process> proc = processManager.start(
     cmd,
-    mode: ProcessStartMode.DETACHED, // ignore: deprecated_member_use
+    mode: ProcessStartMode.detached,
   );
   return proc;
 }
diff --git a/packages/flutter_tools/lib/src/cache.dart b/packages/flutter_tools/lib/src/cache.dart
index b004f20..ccfeb15 100644
--- a/packages/flutter_tools/lib/src/cache.dart
+++ b/packages/flutter_tools/lib/src/cache.dart
@@ -74,7 +74,7 @@
     if (!_lockEnabled)
       return null;
     assert(_lock == null);
-    _lock = await fs.file(fs.path.join(flutterRoot, 'bin', 'cache', 'lockfile')).open(mode: FileMode.WRITE); // ignore: deprecated_member_use
+    _lock = await fs.file(fs.path.join(flutterRoot, 'bin', 'cache', 'lockfile')).open(mode: FileMode.write);
     bool locked = false;
     bool printed = false;
     while (!locked) {
diff --git a/packages/flutter_tools/lib/src/commands/analyze_base.dart b/packages/flutter_tools/lib/src/commands/analyze_base.dart
index e4f7c29..9464d3b 100644
--- a/packages/flutter_tools/lib/src/commands/analyze_base.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze_base.dart
@@ -26,7 +26,7 @@
   void dumpErrors(Iterable<String> errors) {
     if (argResults['write'] != null) {
       try {
-        final RandomAccessFile resultsFile = fs.file(argResults['write']).openSync(mode: FileMode.WRITE); // ignore: deprecated_member_use
+        final RandomAccessFile resultsFile = fs.file(argResults['write']).openSync(mode: FileMode.write);
         try {
           resultsFile.lockSync();
           resultsFile.writeStringSync(errors.join('\n'));
diff --git a/packages/flutter_tools/lib/src/commands/analyze_once.dart b/packages/flutter_tools/lib/src/commands/analyze_once.dart
index b8840a9..49a0eb9 100644
--- a/packages/flutter_tools/lib/src/commands/analyze_once.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze_once.dart
@@ -47,9 +47,9 @@
       for (String directory in directories) {
         final FileSystemEntityType type = fs.typeSync(directory);
 
-        if (type == FileSystemEntityType.NOT_FOUND) { // ignore: deprecated_member_use
+        if (type == FileSystemEntityType.notFound) {
           throwToolExit("'$directory' does not exist");
-        } else if (type != FileSystemEntityType.DIRECTORY) { // ignore: deprecated_member_use
+        } else if (type != FileSystemEntityType.directory) {
           throwToolExit("'$directory' is not a directory");
         }
       }
diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart
index 7c97cf3..7413905 100644
--- a/packages/flutter_tools/lib/src/commands/create.dart
+++ b/packages/flutter_tools/lib/src/commands/create.dart
@@ -453,12 +453,12 @@
 
   final FileSystemEntityType type = fs.typeSync(dirPath);
 
-  if (type != FileSystemEntityType.NOT_FOUND) { // ignore: deprecated_member_use
+  if (type != FileSystemEntityType.notFound) {
     switch (type) {
-      case FileSystemEntityType.FILE: // ignore: deprecated_member_use
+      case FileSystemEntityType.file:
         // Do not overwrite files.
         return "Invalid project name: '$dirPath' - file exists.";
-      case FileSystemEntityType.LINK: // ignore: deprecated_member_use
+      case FileSystemEntityType.link:
         // Do not overwrite links.
         return "Invalid project name: '$dirPath' - refers to a link.";
     }
diff --git a/packages/flutter_tools/lib/src/commands/drive.dart b/packages/flutter_tools/lib/src/commands/drive.dart
index bec0e38..79a5b15 100644
--- a/packages/flutter_tools/lib/src/commands/drive.dart
+++ b/packages/flutter_tools/lib/src/commands/drive.dart
@@ -94,7 +94,7 @@
     if (device == null)
       throwToolExit(null);
 
-    if (await fs.type(testFile) != FileSystemEntityType.FILE) // ignore: deprecated_member_use
+    if (await fs.type(testFile) != FileSystemEntityType.file)
       throwToolExit('Test file not found: $testFile');
 
     String observatoryUri;
@@ -225,7 +225,7 @@
 
 Future<LaunchResult> _startApp(DriveCommand command) async {
   final String mainPath = findMainDartFile(command.targetFile);
-  if (await fs.type(mainPath) != FileSystemEntityType.FILE) { // ignore: deprecated_member_use
+  if (await fs.type(mainPath) != FileSystemEntityType.file) {
     printError('Tried to run $mainPath, but that file does not exist.');
     return null;
   }
diff --git a/packages/flutter_tools/lib/src/commands/fuchsia_reload.dart b/packages/flutter_tools/lib/src/commands/fuchsia_reload.dart
index 9b52118..4650790 100644
--- a/packages/flutter_tools/lib/src/commands/fuchsia_reload.dart
+++ b/packages/flutter_tools/lib/src/commands/fuchsia_reload.dart
@@ -27,7 +27,7 @@
 // $ flutter fuchsia_reload -f ~/fuchsia -a 192.168.1.39 \
 //       -g //lib/flutter/examples/flutter_gallery:flutter_gallery
 
-final String ipv4Loopback = InternetAddress.LOOPBACK_IP_V4.address; // ignore: deprecated_member_use
+final String ipv4Loopback = InternetAddress.loopbackIPv4.address;
 
 class FuchsiaReloadCommand extends FlutterCommand {
   FuchsiaReloadCommand() {
@@ -386,8 +386,8 @@
         final int lastSpace = trimmed.lastIndexOf(' ');
         final String lastWord = trimmed.substring(lastSpace + 1);
         if ((lastWord != '.') && (lastWord != '..')) {
-          // ignore: deprecated_member_use
-          final int value = int.parse(lastWord, onError: (_) => null);
+
+          final int value = int.tryParse(lastWord);
           if (value != null)
             ports.add(value);
         }
diff --git a/packages/flutter_tools/lib/src/commands/ide_config.dart b/packages/flutter_tools/lib/src/commands/ide_config.dart
index ffae001..f392917 100644
--- a/packages/flutter_tools/lib/src/commands/ide_config.dart
+++ b/packages/flutter_tools/lib/src/commands/ide_config.dart
@@ -261,9 +261,9 @@
 String _validateFlutterDir(String dirPath, {String flutterRoot}) {
   final FileSystemEntityType type = fs.typeSync(dirPath);
 
-  if (type != FileSystemEntityType.NOT_FOUND) { // ignore: deprecated_member_use
+  if (type != FileSystemEntityType.notFound) {
     switch (type) {
-      case FileSystemEntityType.LINK: // ignore: deprecated_member_use
+      case FileSystemEntityType.link:
         // Do not overwrite links.
         return "Invalid project root dir: '$dirPath' - refers to a link.";
     }
diff --git a/packages/flutter_tools/lib/src/commands/update_packages.dart b/packages/flutter_tools/lib/src/commands/update_packages.dart
index cf14a2a..0babb97 100644
--- a/packages/flutter_tools/lib/src/commands/update_packages.dart
+++ b/packages/flutter_tools/lib/src/commands/update_packages.dart
@@ -785,8 +785,8 @@
     if (twoLines.length != 2) {
       return new PubspecChecksum(-1, line);
     }
-    // ignore: deprecated_member_use
-    final int value = int.parse(twoLines.last.trim(), radix: 16, onError: (String _) => -1);
+
+    final int value = int.tryParse(twoLines.last.trim(), radix: 16) ?? -1;
     return new PubspecChecksum(value, line);
   }
 }
diff --git a/packages/flutter_tools/lib/src/dependency_checker.dart b/packages/flutter_tools/lib/src/dependency_checker.dart
index a8c0cc0..1ff6eaa 100644
--- a/packages/flutter_tools/lib/src/dependency_checker.dart
+++ b/packages/flutter_tools/lib/src/dependency_checker.dart
@@ -30,7 +30,7 @@
     for (String path in _dependencies) {
       final File file = fs.file(path);
       final FileStat stat = file.statSync();
-      if (stat.type == FileSystemEntityType.NOT_FOUND) { // ignore: deprecated_member_use
+      if (stat.type == FileSystemEntityType.notFound) {
         printTrace('DependencyChecker: Error stating $path.');
         return true;
       }
diff --git a/packages/flutter_tools/lib/src/devfs.dart b/packages/flutter_tools/lib/src/devfs.dart
index a4905e9..1ec19a7 100644
--- a/packages/flutter_tools/lib/src/devfs.dart
+++ b/packages/flutter_tools/lib/src/devfs.dart
@@ -46,7 +46,7 @@
   Stream<List<int>> contentsAsStream();
 
   Stream<List<int>> contentsAsCompressedStream() {
-    return contentsAsStream().transform(GZIP.encoder); // ignore: deprecated_member_use
+    return contentsAsStream().transform(gzip.encoder);
   }
 
   /// Return the list of files this content depends on.
@@ -86,7 +86,7 @@
       return;
     }
     _fileStat = file.statSync();
-    if (_fileStat.type == FileSystemEntityType.LINK) { // ignore: deprecated_member_use
+    if (_fileStat.type == FileSystemEntityType.link) {
       // Resolve, stat, and maybe cache the symlink target.
       final String resolved = file.resolveSymbolicLinksSync();
       final FileSystemEntity linkTarget = fs.file(resolved);
@@ -666,7 +666,7 @@
           try {
             final FileSystemEntityType linkType =
                 fs.statSync(file.resolveSymbolicLinksSync()).type;
-            if (linkType == FileSystemEntityType.DIRECTORY) // ignore: deprecated_member_use
+            if (linkType == FileSystemEntityType.directory)
               continue;
           } on FileSystemException catch (e) {
             _printScanDirectoryError(file.path, e);
diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart
index 63c8da9..2105872 100644
--- a/packages/flutter_tools/lib/src/ios/mac.dart
+++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -582,7 +582,7 @@
     'framework': fs.path.basenameWithoutExtension(service['ios-framework'])
   }).toList();
   final Map<String, dynamic> jsonObject = <String, dynamic>{ 'services' : jsonServices };
-  manifest.writeAsStringSync(json.encode(jsonObject), mode: FileMode.WRITE, flush: true); // ignore: deprecated_member_use
+  manifest.writeAsStringSync(json.encode(jsonObject), mode: FileMode.write, flush: true);
 }
 
 Future<bool> upgradePbxProjWithFlutterAssets(String app, String appPath) async {
diff --git a/packages/flutter_tools/lib/src/ios/simulators.dart b/packages/flutter_tools/lib/src/ios/simulators.dart
index af9d646..16fcbc7 100644
--- a/packages/flutter_tools/lib/src/ios/simulators.dart
+++ b/packages/flutter_tools/lib/src/ios/simulators.dart
@@ -435,7 +435,7 @@
   void clearLogs() {
     final File logFile = fs.file(logFilePath);
     if (logFile.existsSync()) {
-      final RandomAccessFile randomFile = logFile.openSync(mode: FileMode.WRITE); // ignore: deprecated_member_use
+      final RandomAccessFile randomFile = logFile.openSync(mode: FileMode.write);
       randomFile.truncateSync(0);
       randomFile.closeSync();
     }
diff --git a/packages/flutter_tools/lib/src/services.dart b/packages/flutter_tools/lib/src/services.dart
index faf5a57..5668efc 100644
--- a/packages/flutter_tools/lib/src/services.dart
+++ b/packages/flutter_tools/lib/src/services.dart
@@ -105,6 +105,6 @@
 
   final Map<String, dynamic> jsonObject = <String, dynamic>{ 'services': services };
   final File servicesFile = fs.file(fs.path.join(dir, 'services.json'));
-  servicesFile.writeAsStringSync(json.encode(jsonObject), mode: FileMode.WRITE, flush: true); // ignore: deprecated_member_use
+  servicesFile.writeAsStringSync(json.encode(jsonObject), mode: FileMode.write, flush: true);
   return servicesFile;
 }
diff --git a/packages/flutter_tools/lib/src/test/flutter_platform.dart b/packages/flutter_tools/lib/src/test/flutter_platform.dart
index 81948ae..8c69a43 100644
--- a/packages/flutter_tools/lib/src/test/flutter_platform.dart
+++ b/packages/flutter_tools/lib/src/test/flutter_platform.dart
@@ -52,8 +52,8 @@
 /// The address at which our WebSocket server resides and at which the sky_shell
 /// processes will host the Observatory server.
 final Map<InternetAddressType, InternetAddress> _kHosts = <InternetAddressType, InternetAddress>{
-  InternetAddressType.IP_V4: InternetAddress.LOOPBACK_IP_V4, // ignore: deprecated_member_use
-  InternetAddressType.IP_V6: InternetAddress.LOOPBACK_IP_V6, // ignore: deprecated_member_use
+  InternetAddressType.IPv4: InternetAddress.loopbackIPv4,
+  InternetAddressType.IPv6: InternetAddress.loopbackIPv6,
 };
 
 /// Configure the `test` package to work with Flutter.
@@ -73,7 +73,7 @@
   bool trackWidgetCreation = false,
   bool updateGoldens = false,
   int observatoryPort,
-  InternetAddressType serverType = InternetAddressType.IP_V4, // ignore: deprecated_member_use
+  InternetAddressType serverType = InternetAddressType.IPv4,
 }) {
   assert(!enableObservatory || (!startPaused && observatoryPort == null));
   hack.registerPlatformPlugin(
@@ -120,7 +120,7 @@
   assert(host != null);
   assert(updateGoldens != null);
 
-  final String websocketUrl = host.type == InternetAddressType.IP_V4 // ignore: deprecated_member_use
+  final String websocketUrl = host.type == InternetAddressType.IPv4
       ? 'ws://${host.address}'
       : 'ws://[${host.address}]';
   final String encodedWebsocketUrl = Uri.encodeComponent(websocketUrl);
@@ -796,7 +796,7 @@
     } else {
       command.add('--disable-observatory');
     }
-    if (host.type == InternetAddressType.IP_V6) // ignore: deprecated_member_use
+    if (host.type == InternetAddressType.IPv6)
       command.add('--ipv6');
     if (bundlePath != null) {
       command.add('--flutter-assets-dir=$bundlePath');
diff --git a/packages/flutter_tools/lib/src/test/runner.dart b/packages/flutter_tools/lib/src/test/runner.dart
index 384d64c..e447e2f 100644
--- a/packages/flutter_tools/lib/src/test/runner.dart
+++ b/packages/flutter_tools/lib/src/test/runner.dart
@@ -78,7 +78,7 @@
     throwToolExit('Cannot find Flutter shell at $shellPath');
 
   final InternetAddressType serverType =
-      ipv6 ? InternetAddressType.IP_V6 : InternetAddressType.IP_V4; // ignore: deprecated_member_use
+      ipv6 ? InternetAddressType.IPv6 : InternetAddressType.IPv4;
 
   loader.installHook(
     shellPath: shellPath,
diff --git a/packages/flutter_tools/lib/src/version.dart b/packages/flutter_tools/lib/src/version.dart
index 6947a27..28e1328 100644
--- a/packages/flutter_tools/lib/src/version.dart
+++ b/packages/flutter_tools/lib/src/version.dart
@@ -534,10 +534,7 @@
       printTrace('Could not interpret results of "git describe": $version');
       return const GitTagVersion.unknown();
     }
-    final List<int> parsedParts = parts.take(4).map<int>(
-      // ignore: deprecated_member_use
-      (String value) => int.parse(value, onError: (String value) => null),
-    ).toList();
+    final List<int> parsedParts = parts.take(4).map<int>(int.tryParse).toList();
     return new GitTagVersion(parsedParts[0], parsedParts[1], parsedParts[2], parsedParts[3], parts[4]);
   }
 
diff --git a/packages/flutter_tools/lib/src/vmservice.dart b/packages/flutter_tools/lib/src/vmservice.dart
index cc2767c..c010e76 100644
--- a/packages/flutter_tools/lib/src/vmservice.dart
+++ b/packages/flutter_tools/lib/src/vmservice.dart
@@ -1402,7 +1402,7 @@
   Iterable<MapEntry<String, dynamic>> get entries => _map.entries;
   @override
   void updateAll(dynamic update(String key, dynamic value)) => _map.updateAll(update);
-  Map<RK, RV> retype<RK, RV>() => _map.cast<RK, RV>(); // ignore: deprecated_member_use,annotate_overrides
+  Map<RK, RV> retype<RK, RV>() => _map.cast<RK, RV>(); // ignore: annotate_overrides
   @override
   dynamic update(String key, dynamic update(dynamic value), {dynamic ifAbsent()}) => _map.update(key, update, ifAbsent: ifAbsent);
 }
