diff --git a/packages/animations/lib/src/open_container.dart b/packages/animations/lib/src/open_container.dart
index e2eb5a4..67ec13e 100644
--- a/packages/animations/lib/src/open_container.dart
+++ b/packages/animations/lib/src/open_container.dart
@@ -628,7 +628,7 @@
     if (hideableKey.currentState?.isVisible == false) {
       // This route may be disposed without dismissing its animation if it is
       // removed by the navigator.
-      SchedulerBinding.instance!
+      _ambiguate(SchedulerBinding.instance)!
           .addPostFrameCallback((Duration d) => _toggleHideable(hide: false));
     }
     super.dispose();
@@ -662,7 +662,7 @@
     }
 
     if (delayForSourceRoute) {
-      SchedulerBinding.instance!
+      _ambiguate(SchedulerBinding.instance)!
           .addPostFrameCallback(takeMeasurementsInSourceRoute);
     } else {
       takeMeasurementsInSourceRoute();
@@ -901,3 +901,11 @@
     return _flipped;
   }
 }
+
+/// This allows a value of type T or T? to be treated as a value of type T?.
+///
+/// We use this so that APIs that have become non-nullable can still be used
+/// with `!` and `?` on the stable branch.
+// TODO(ianh): Remove this once the relevant APIs have shipped to stable.
+// See https://github.com/flutter/flutter/issues/64830
+T? _ambiguate<T>(T? value) => value;
diff --git a/packages/flutter_image/test/network_test.dart b/packages/flutter_image/test/network_test.dart
index 9f1ffb6..10a5727 100644
--- a/packages/flutter_image/test/network_test.dart
+++ b/packages/flutter_image/test/network_test.dart
@@ -137,26 +137,42 @@
 }
 
 void assertThatImageLoadingFails(
-    NetworkImageWithRetry subject, List<FlutterErrorDetails> errorLog) {
-  subject
-      .load(subject, PaintingBinding.instance!.instantiateImageCodec)
-      .addListener(ImageStreamListener(
-        (ImageInfo image, bool synchronousCall) {},
-        onError: expectAsync2((Object error, StackTrace? _) {
-          expect(errorLog.single.exception, isInstanceOf<FetchFailure>());
-          expect(error, isInstanceOf<FetchFailure>());
-          expect(error, equals(errorLog.single.exception));
-        }),
-      ));
+  NetworkImageWithRetry subject,
+  List<FlutterErrorDetails> errorLog,
+) {
+  final ImageStreamCompleter completer = subject.load(
+    subject,
+    _ambiguate(PaintingBinding.instance)!.instantiateImageCodec,
+  );
+  completer.addListener(ImageStreamListener(
+    (ImageInfo image, bool synchronousCall) {},
+    onError: expectAsync2((Object error, StackTrace? _) {
+      expect(errorLog.single.exception, isInstanceOf<FetchFailure>());
+      expect(error, isInstanceOf<FetchFailure>());
+      expect(error, equals(errorLog.single.exception));
+    }),
+  ));
 }
 
-void assertThatImageLoadingSucceeds(NetworkImageWithRetry subject) {
-  subject
-      .load(subject, PaintingBinding.instance!.instantiateImageCodec)
-      .addListener(
-    ImageStreamListener(expectAsync2((ImageInfo image, bool synchronousCall) {
+void assertThatImageLoadingSucceeds(
+  NetworkImageWithRetry subject,
+) {
+  final ImageStreamCompleter completer = subject.load(
+    subject,
+    _ambiguate(PaintingBinding.instance)!.instantiateImageCodec,
+  );
+  completer.addListener(ImageStreamListener(
+    expectAsync2((ImageInfo image, bool synchronousCall) {
       expect(image.image.height, 1);
       expect(image.image.width, 1);
-    })),
-  );
+    }),
+  ));
 }
+
+/// This allows a value of type T or T? to be treated as a value of type T?.
+///
+/// We use this so that APIs that have become non-nullable can still be used
+/// with `!` and `?` on the stable branch.
+// TODO(ianh): Remove this once the relevant APIs have shipped to stable.
+// See https://github.com/flutter/flutter/issues/64830
+T? _ambiguate<T>(T? value) => value;
diff --git a/packages/flutter_markdown/test/utils.dart b/packages/flutter_markdown/test/utils.dart
index 497d257..dcf5288 100644
--- a/packages/flutter_markdown/test/utils.dart
+++ b/packages/flutter_markdown/test/utils.dart
@@ -154,9 +154,13 @@
 }
 
 String dumpRenderView() {
-  return WidgetsBinding.instance!.renderViewElement!.toStringDeep().replaceAll(
-      RegExp(r'SliverChildListDelegate#\d+', multiLine: true),
-      'SliverChildListDelegate');
+  return _ambiguate(WidgetsBinding.instance)!
+      .renderViewElement!
+      .toStringDeep()
+      .replaceAll(
+        RegExp(r'SliverChildListDelegate#\d+', multiLine: true),
+        'SliverChildListDelegate',
+      );
 }
 
 /// Wraps a widget with a left-to-right [Directionality] for tests.
@@ -197,3 +201,11 @@
     }
   }
 }
+
+/// This allows a value of type T or T? to be treated as a value of type T?.
+///
+/// We use this so that APIs that have become non-nullable can still be used
+/// with `!` and `?` on the stable branch.
+// TODO(ianh): Remove this once the relevant APIs have shipped to stable.
+// See https://github.com/flutter/flutter/issues/64830
+T? _ambiguate<T>(T? value) => value;
diff --git a/packages/rfw/example/wasm/lib/main.dart b/packages/rfw/example/wasm/lib/main.dart
index c91b4d0..007f1f2 100644
--- a/packages/rfw/example/wasm/lib/main.dart
+++ b/packages/rfw/example/wasm/lib/main.dart
@@ -38,7 +38,7 @@
   @override
   void initState() {
     super.initState();
-    RendererBinding.instance!.deferFirstFrame();
+    _ambiguate(RendererBinding.instance)!.deferFirstFrame();
     _runtime.update(const LibraryName(<String>['core', 'widgets']), createCoreWidgets());
     _loadLogic();
   }
@@ -62,7 +62,7 @@
     _logic = WasmModule(await logicFile.readAsBytes()).builder().build();
     _dataFetcher = _logic.lookupFunction('value');
     _updateData();
-    setState(() { RendererBinding.instance!.allowFirstFrame(); });
+    setState(() { _ambiguate(RendererBinding.instance)!.allowFirstFrame(); });
   }
 
   void _updateData() {
@@ -78,7 +78,7 @@
 
   @override
   Widget build(BuildContext context) {
-    if (!RendererBinding.instance!.sendFramesToEngine)
+    if (!_ambiguate(RendererBinding.instance)!.sendFramesToEngine)
       return const SizedBox.shrink();
     return RemoteWidget(
       runtime: _runtime,
@@ -92,3 +92,11 @@
     );
   }
 }
+
+/// This allows a value of type T or T? to be treated as a value of type T?.
+///
+/// We use this so that APIs that have become non-nullable can still be used
+/// with `!` and `?` on the stable branch.
+// TODO(ianh): Remove this once the relevant APIs have shipped to stable.
+// See https://github.com/flutter/flutter/issues/64830
+T? _ambiguate<T>(T? value) => value;
