[webview_flutter_wkwebview] NSError.toString (#4441)

Fixes https://github.com/flutter/flutter/issues/128596
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
index 59f6f3d..e24e3e0 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 3.6.3
+
+* Introduces `NSError.toString` for better diagnostics.
+
 ## 3.6.2 
 
 * Fixes unawaited_futures violations.
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart
index 818f018..e8dde5e 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart
+++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart
@@ -215,7 +215,7 @@
 
   /// The error code.
   ///
-  /// Note that errors are domain-specific.
+  /// Error codes are [domain]-specific.
   final int code;
 
   /// A string containing the error domain.
@@ -223,6 +223,14 @@
 
   /// A string containing the localized description of the error.
   final String localizedDescription;
+
+  @override
+  String toString() {
+    if (localizedDescription.isEmpty) {
+      return 'Error $domain:$code';
+    }
+    return '$localizedDescription ($domain:$code)';
+  }
 }
 
 /// A representation of an HTTP cookie.
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
index 166ab4a..9c313c0 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
+++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
@@ -2,7 +2,7 @@
 description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control.
 repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter_wkwebview
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
-version: 3.6.2
+version: 3.6.3
 
 environment:
   sdk: ">=2.18.0 <4.0.0"
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/src/foundation/foundation_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/src/foundation/foundation_test.dart
index a6e0427..3dbaea0 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/test/src/foundation/foundation_test.dart
+++ b/packages/webview_flutter/webview_flutter_wkwebview/test/src/foundation/foundation_test.dart
@@ -246,4 +246,39 @@
       });
     });
   });
+
+  test('NSError', () {
+    expect(
+      const NSError(
+        code: 0,
+        domain: 'domain',
+        localizedDescription: 'desc',
+      ).toString(),
+      'desc (domain:0)',
+    );
+    expect(
+      const NSError(
+        code: 0,
+        domain: 'domain',
+        localizedDescription: '',
+      ).toString(),
+      'Error domain:0',
+    );
+    expect(
+      const NSError(
+        code: 255,
+        domain: 'bar',
+        localizedDescription: 'baz',
+      ).toString(),
+      'baz (bar:255)',
+    );
+    expect(
+      const NSError(
+        code: 255,
+        domain: 'bar',
+        localizedDescription: '',
+      ).toString(),
+      'Error bar:255',
+    );
+  });
 }