diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/v4/src/android_navigation_delegate.dart b/packages/webview_flutter/webview_flutter_android/lib/src/v4/src/android_navigation_delegate.dart
index 0d2630f..b40b5d8 100644
--- a/packages/webview_flutter/webview_flutter_android/lib/src/v4/src/android_navigation_delegate.dart
+++ b/packages/webview_flutter/webview_flutter_android/lib/src/v4/src/android_navigation_delegate.dart
@@ -81,7 +81,6 @@
     extends PlatformNavigationDelegateCreationParams {
   /// Creates a new [AndroidNavigationDelegateCreationParams] instance.
   const AndroidNavigationDelegateCreationParams._({
-    this.loadUrl,
     @visibleForTesting this.androidWebViewProxy = const AndroidWebViewProxy(),
   }) : super();
 
@@ -90,19 +89,14 @@
     // Recommended placeholder to prevent being broken by platform interface.
     // ignore: avoid_unused_constructor_parameters
     PlatformNavigationDelegateCreationParams params, {
-    LoadUrlCallback? loadUrl,
     @visibleForTesting
         AndroidWebViewProxy androidWebViewProxy = const AndroidWebViewProxy(),
   }) {
     return AndroidNavigationDelegateCreationParams._(
-      loadUrl: loadUrl,
       androidWebViewProxy: androidWebViewProxy,
     );
   }
 
-  /// Callback responsible for loading the [url] after a navigation request is approved.
-  final LoadUrlCallback? loadUrl;
-
   /// Handles constructing objects and calling static methods for the Android WebView
   /// native library.
   @visibleForTesting
@@ -211,19 +205,17 @@
   ProgressCallback? _onProgress;
   WebResourceErrorCallback? _onWebResourceError;
   NavigationRequestCallback? _onNavigationRequest;
-
-  AndroidNavigationDelegateCreationParams get _androidParams =>
-      params as AndroidNavigationDelegateCreationParams;
-
-  bool get _handlesNavigation =>
-      _onNavigationRequest != null && _androidParams.loadUrl != null;
+  LoadUrlCallback? _onLoadUrl;
 
   void _handleNavigation(String url, Map<String, String> headers) {
-    if (!_handlesNavigation) {
+    final LoadUrlCallback? onLoadUrl = _onLoadUrl;
+    final NavigationRequestCallback? onNavigationRequest = _onNavigationRequest;
+
+    if (onNavigationRequest == null || onLoadUrl == null) {
       return;
     }
 
-    final FutureOr<NavigationDecision> returnValue = _onNavigationRequest!(
+    final FutureOr<NavigationDecision> returnValue = onNavigationRequest(
       NavigationRequest(
         isMainFrame: true,
         url: url,
@@ -232,21 +224,29 @@
 
     if (returnValue is NavigationDecision &&
         returnValue == NavigationDecision.navigate) {
-      _androidParams.loadUrl!(url, headers);
+      onLoadUrl(url, headers);
     } else if (returnValue is Future<NavigationDecision>) {
       returnValue.then((NavigationDecision shouldLoadUrl) {
         if (shouldLoadUrl == NavigationDecision.navigate) {
-          _androidParams.loadUrl!(url, headers);
+          onLoadUrl(url, headers);
         }
       });
     }
   }
 
+  /// Invoked when loading the [url] after a navigation request is approved.
+  Future<void> setOnLoadUrl(
+    LoadUrlCallback onLoadUrl,
+  ) async {
+    _onLoadUrl = onLoadUrl;
+  }
+
   @override
   Future<void> setOnNavigationRequest(
     NavigationRequestCallback onNavigationRequest,
   ) async {
     _onNavigationRequest = onNavigationRequest;
+    _webViewClient.setSynchronousReturnValueForShouldOverrideUrlLoading(true);
   }
 
   @override
diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/v4/src/android_proxy.dart b/packages/webview_flutter/webview_flutter_android/lib/src/v4/src/android_proxy.dart
index 757397a..4a9ce19 100644
--- a/packages/webview_flutter/webview_flutter_android/lib/src/v4/src/android_proxy.dart
+++ b/packages/webview_flutter/webview_flutter_android/lib/src/v4/src/android_proxy.dart
@@ -28,7 +28,6 @@
 
   /// Constructs a [android_webview.WebViewClient].
   final android_webview.WebViewClient Function({
-    bool shouldOverrideUrlLoading,
     void Function(android_webview.WebView webView, String url)? onPageStarted,
     void Function(android_webview.WebView webView, String url)? onPageFinished,
     void Function(
diff --git a/packages/webview_flutter/webview_flutter_android/test/v4/android_navigation_delegate_test.dart b/packages/webview_flutter/webview_flutter_android/test/v4/android_navigation_delegate_test.dart
index dfde021..03b7abc 100644
--- a/packages/webview_flutter/webview_flutter_android/test/v4/android_navigation_delegate_test.dart
+++ b/packages/webview_flutter/webview_flutter_android/test/v4/android_navigation_delegate_test.dart
@@ -14,11 +14,11 @@
 void main() {
   group('AndroidNavigationDelegate', () {
     test('onPageFinished', () {
-      final AndroidNavigationDelegate webKitDelegate =
+      final AndroidNavigationDelegate androidNavigationDelegate =
           AndroidNavigationDelegate(_buildCreationParams());
 
       late final String callbackUrl;
-      webKitDelegate.setOnPageFinished((String url) => callbackUrl = url);
+      androidNavigationDelegate.setOnPageFinished((String url) => callbackUrl = url);
 
       CapturingWebViewClient.lastCreatedDelegate.onPageFinished!(
         android_webview.WebView.detached(),
@@ -29,11 +29,11 @@
     });
 
     test('onPageStarted', () {
-      final AndroidNavigationDelegate webKitDelegate =
+      final AndroidNavigationDelegate androidNavigationDelegate =
           AndroidNavigationDelegate(_buildCreationParams());
 
       late final String callbackUrl;
-      webKitDelegate.setOnPageStarted((String url) => callbackUrl = url);
+      androidNavigationDelegate.setOnPageStarted((String url) => callbackUrl = url);
 
       CapturingWebViewClient.lastCreatedDelegate.onPageStarted!(
         android_webview.WebView.detached(),
@@ -44,11 +44,11 @@
     });
 
     test('onWebResourceError from onReceivedRequestError', () {
-      final AndroidNavigationDelegate webKitDelegate =
+      final AndroidNavigationDelegate androidNavigationDelegate =
           AndroidNavigationDelegate(_buildCreationParams());
 
       late final WebResourceError callbackError;
-      webKitDelegate.setOnWebResourceError(
+      androidNavigationDelegate.setOnWebResourceError(
           (WebResourceError error) => callbackError = error);
 
       CapturingWebViewClient.lastCreatedDelegate.onReceivedRequestError!(
@@ -74,11 +74,11 @@
     });
 
     test('onWebResourceError from onRequestError', () {
-      final AndroidNavigationDelegate webKitDelegate =
+      final AndroidNavigationDelegate androidNavigationDelegate =
           AndroidNavigationDelegate(_buildCreationParams());
 
       late final WebResourceError callbackError;
-      webKitDelegate.setOnWebResourceError(
+      androidNavigationDelegate.setOnWebResourceError(
           (WebResourceError error) => callbackError = error);
 
       CapturingWebViewClient.lastCreatedDelegate.onReceivedError!(
@@ -97,11 +97,11 @@
     test(
         'onNavigationRequest from requestLoading should not be called when loadUrlCallback is not specified',
         () {
-      final AndroidNavigationDelegate webKitDelegate =
+      final AndroidNavigationDelegate androidNavigationDelegate =
           AndroidNavigationDelegate(_buildCreationParams());
 
       NavigationRequest? callbackNavigationRequest;
-      webKitDelegate
+      androidNavigationDelegate
           .setOnNavigationRequest((NavigationRequest navigationRequest) {
         callbackNavigationRequest = navigationRequest;
         return NavigationDecision.prevent;
@@ -126,13 +126,16 @@
         'onLoadUrl from requestLoading should not be called when navigationRequestCallback is not specified',
         () {
       final Completer<void> completer = Completer<void>();
-      AndroidNavigationDelegate(_buildCreationParams(loadUrlCallback: (
+      final AndroidNavigationDelegate androidNavigationDelegate = AndroidNavigationDelegate(_buildCreationParams());
+
+      androidNavigationDelegate.setOnLoadUrl((
         String url,
         Map<String, String>? headers,
       ) {
         completer.complete();
         return completer.future;
-      }));
+      });
+
 
       CapturingWebViewClient.lastCreatedDelegate.requestLoading!(
         android_webview.WebView.detached(),
@@ -153,17 +156,19 @@
         'onLoadUrl from requestLoading should not be called when onNavigationRequestCallback returns NavigationDecision.prevent',
         () {
       final Completer<void> completer = Completer<void>();
-      final AndroidNavigationDelegate webKitDelegate =
-          AndroidNavigationDelegate(_buildCreationParams(loadUrlCallback: (
+      final AndroidNavigationDelegate androidNavigationDelegate =
+          AndroidNavigationDelegate(_buildCreationParams());
+
+      androidNavigationDelegate.setOnLoadUrl((
         String url,
         Map<String, String>? headers,
       ) {
         completer.complete();
         return completer.future;
-      }));
+      });
 
       late final NavigationRequest callbackNavigationRequest;
-      webKitDelegate
+      androidNavigationDelegate
           .setOnNavigationRequest((NavigationRequest navigationRequest) {
         callbackNavigationRequest = navigationRequest;
         return NavigationDecision.prevent;
@@ -192,8 +197,10 @@
       final Completer<void> completer = Completer<void>();
       late final String loadUrlCallbackUrl;
       late final Map<String, String>? loadUrlCallbackHeaders;
-      final AndroidNavigationDelegate webKitDelegate =
-          AndroidNavigationDelegate(_buildCreationParams(loadUrlCallback: (
+      final AndroidNavigationDelegate androidNavigationDelegate =
+          AndroidNavigationDelegate(_buildCreationParams());
+
+      androidNavigationDelegate.setOnLoadUrl((
         String url,
         Map<String, String>? headers,
       ) {
@@ -201,10 +208,10 @@
         loadUrlCallbackHeaders = headers;
         completer.complete();
         return completer.future;
-      }));
+      });
 
       late final NavigationRequest callbackNavigationRequest;
-      webKitDelegate
+      androidNavigationDelegate
           .setOnNavigationRequest((NavigationRequest navigationRequest) {
         callbackNavigationRequest = navigationRequest;
         return NavigationDecision.navigate;
@@ -232,11 +239,11 @@
     test(
         'onNavigationRequest from urlLoading should not be called when loadUrlCallback is not specified',
         () {
-      final AndroidNavigationDelegate webKitDelegate =
+      final AndroidNavigationDelegate androidNavigationDelegate =
           AndroidNavigationDelegate(_buildCreationParams());
 
       NavigationRequest? callbackNavigationRequest;
-      webKitDelegate
+      androidNavigationDelegate
           .setOnNavigationRequest((NavigationRequest navigationRequest) {
         callbackNavigationRequest = navigationRequest;
         return NavigationDecision.prevent;
@@ -254,13 +261,15 @@
         'onLoadUrl from urlLoading should not be called when navigationRequestCallback is not specified',
         () {
       final Completer<void> completer = Completer<void>();
-      AndroidNavigationDelegate(_buildCreationParams(loadUrlCallback: (
+      final AndroidNavigationDelegate androidNavigationDelegate = AndroidNavigationDelegate(_buildCreationParams());
+
+      androidNavigationDelegate.setOnLoadUrl((
         String url,
         Map<String, String>? headers,
       ) {
         completer.complete();
         return completer.future;
-      }));
+      });
 
       CapturingWebViewClient.lastCreatedDelegate.urlLoading!(
         android_webview.WebView.detached(),
@@ -274,17 +283,19 @@
         'onLoadUrl from urlLoading should not be called when onNavigationRequestCallback returns NavigationDecision.prevent',
         () {
       final Completer<void> completer = Completer<void>();
-      final AndroidNavigationDelegate webKitDelegate =
-          AndroidNavigationDelegate(_buildCreationParams(loadUrlCallback: (
+      final AndroidNavigationDelegate androidNavigationDelegate =
+          AndroidNavigationDelegate(_buildCreationParams());
+
+      androidNavigationDelegate.setOnLoadUrl((
         String url,
         Map<String, String>? headers,
       ) {
         completer.complete();
         return completer.future;
-      }));
+      });
 
       late final NavigationRequest callbackNavigationRequest;
-      webKitDelegate
+      androidNavigationDelegate
           .setOnNavigationRequest((NavigationRequest navigationRequest) {
         callbackNavigationRequest = navigationRequest;
         return NavigationDecision.prevent;
@@ -306,8 +317,10 @@
       final Completer<void> completer = Completer<void>();
       late final String loadUrlCallbackUrl;
       late final Map<String, String>? loadUrlCallbackHeaders;
-      final AndroidNavigationDelegate webKitDelegate =
-          AndroidNavigationDelegate(_buildCreationParams(loadUrlCallback: (
+      final AndroidNavigationDelegate androidNavigationDelegate =
+          AndroidNavigationDelegate(_buildCreationParams());
+
+      androidNavigationDelegate.setOnLoadUrl((
         String url,
         Map<String, String>? headers,
       ) {
@@ -315,10 +328,10 @@
         loadUrlCallbackHeaders = headers;
         completer.complete();
         return completer.future;
-      }));
+      });
 
       late final NavigationRequest callbackNavigationRequest;
-      webKitDelegate
+      androidNavigationDelegate
           .setOnNavigationRequest((NavigationRequest navigationRequest) {
         callbackNavigationRequest = navigationRequest;
         return NavigationDecision.navigate;
@@ -336,12 +349,23 @@
       expect(completer.isCompleted, true);
     });
 
-    test('setOnProgress', () {
-      final AndroidNavigationDelegate webKitDelegate =
+    test('setOnNavigationRequest should override URL loading', () {
+      final AndroidNavigationDelegate androidNavigationDelegate =
+          AndroidNavigationDelegate(_buildCreationParams());
+
+      androidNavigationDelegate.setOnNavigationRequest(
+        (NavigationRequest request) => NavigationDecision.navigate,
+      );
+
+      expect(CapturingWebViewClient.lastCreatedDelegate.synchronousReturnValueForShouldOverrideUrlLoading, isTrue);
+    });
+
+    test('onProgress', () {
+      final AndroidNavigationDelegate androidNavigationDelegate =
           AndroidNavigationDelegate(_buildCreationParams());
 
       late final int callbackProgress;
-      webKitDelegate
+      androidNavigationDelegate
           .setOnProgress((int progress) => callbackProgress = progress);
 
       CapturingWebChromeClient.lastCreatedDelegate.onProgressChanged!(
@@ -354,13 +378,10 @@
   });
 }
 
-AndroidNavigationDelegateCreationParams _buildCreationParams({
-  LoadUrlCallback? loadUrlCallback,
-}) {
+AndroidNavigationDelegateCreationParams _buildCreationParams() {
   return AndroidNavigationDelegateCreationParams
       .fromPlatformNavigationDelegateCreationParams(
     const PlatformNavigationDelegateCreationParams(),
-    loadUrl: loadUrlCallback,
     androidWebViewProxy: const AndroidWebViewProxy(
       createAndroidWebChromeClient: CapturingWebChromeClient.new,
       createAndroidWebViewClient: CapturingWebViewClient.new,
@@ -376,12 +397,19 @@
     super.onReceivedError,
     super.onReceivedRequestError,
     super.requestLoading,
-    super.shouldOverrideUrlLoading,
     super.urlLoading,
   }) : super.detached() {
     lastCreatedDelegate = this;
   }
+
   static CapturingWebViewClient lastCreatedDelegate = CapturingWebViewClient();
+
+  bool synchronousReturnValueForShouldOverrideUrlLoading = false;
+
+  @override
+  Future<void> setSynchronousReturnValueForShouldOverrideUrlLoading(bool value) async {
+    synchronousReturnValueForShouldOverrideUrlLoading = value;
+  }
 }
 
 // Records the last created instance of itself.
