Added PR feedback
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.