Prevent setting user agent string to default value on every rebuild (#4618)

diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md
index 7bd3387..1337bab 100644
--- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 2.8.1
+
+* Fixes bug where the default user agent string was being set for every rebuild. See
+  https://github.com/flutter/flutter/issues/94847.
+
 ## 2.8.0
 
 * Implements new cookie manager for setting cookies and providing initial cookies.
diff --git a/packages/webview_flutter/webview_flutter_android/lib/webview_android_widget.dart b/packages/webview_flutter/webview_flutter_android/lib/webview_android_widget.dart
index 1dec9c1..de55b52 100644
--- a/packages/webview_flutter/webview_flutter_android/lib/webview_android_widget.dart
+++ b/packages/webview_flutter/webview_flutter_android/lib/webview_android_widget.dart
@@ -418,11 +418,12 @@
   }
 
   Future<void> _setUserAgent(WebSetting<String?> userAgent) {
-    if (userAgent.isPresent && userAgent.value != null) {
-      return webView.settings.setUserAgentString(userAgent.value!);
+    if (userAgent.isPresent) {
+      // If the string is empty, the system default value will be used.
+      return webView.settings.setUserAgentString(userAgent.value ?? '');
     }
 
-    return webView.settings.setUserAgentString('');
+    return Future<void>.value();
   }
 
   Future<void> _setZoomEnabled(bool zoomEnabled) {
diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml
index 34bea57..0b78c72 100644
--- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml
+++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml
@@ -2,7 +2,7 @@
 description: A Flutter plugin that provides a WebView widget on Android.
 repository: https://github.com/flutter/plugins/tree/master/packages/webview_flutter/webview_flutter_android
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
-version: 2.8.0
+version: 2.8.1
 
 environment:
   sdk: ">=2.14.0 <3.0.0"
diff --git a/packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.dart b/packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.dart
index c203ef0..2b25022 100644
--- a/packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.dart
+++ b/packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.dart
@@ -483,6 +483,32 @@
         });
       });
 
+      testWidgets('no update to userAgentString when there is no change',
+          (WidgetTester tester) async {
+        await buildWidget(tester);
+
+        reset(mockWebSettings);
+
+        await testController.updateSettings(WebSettings(
+          userAgent: const WebSetting<String>.absent(),
+        ));
+
+        verifyNever(mockWebSettings.setUserAgentString(any));
+      });
+
+      testWidgets('update null userAgentString with empty string',
+          (WidgetTester tester) async {
+        await buildWidget(tester);
+
+        reset(mockWebSettings);
+
+        await testController.updateSettings(WebSettings(
+          userAgent: const WebSetting<String?>.of(null),
+        ));
+
+        verify(mockWebSettings.setUserAgentString(''));
+      });
+
       testWidgets('currentUrl', (WidgetTester tester) async {
         await buildWidget(tester);