[shared_preferences_web] migrate to pkg:web (#5414)

This allows this package to be used in a web app compiled to Wasm.

Helps unblock https://github.com/flutter/devtools/issues/6606
diff --git a/packages/shared_preferences/shared_preferences_web/CHANGELOG.md b/packages/shared_preferences/shared_preferences_web/CHANGELOG.md
index 747f25a..5f5d8c2 100644
--- a/packages/shared_preferences/shared_preferences_web/CHANGELOG.md
+++ b/packages/shared_preferences/shared_preferences_web/CHANGELOG.md
@@ -1,6 +1,6 @@
-## NEXT
+## 2.2.2
 
-* Updates minimum supported SDK version to Flutter 3.10/Dart 3.0.
+* Updates minimum supported SDK version to Dart 3.2.
 
 ## 2.2.1
 
diff --git a/packages/shared_preferences/shared_preferences_web/example/integration_test/shared_preferences_web_test.dart b/packages/shared_preferences/shared_preferences_web/example/integration_test/shared_preferences_web_test.dart
index 53a47db..b5f905b 100644
--- a/packages/shared_preferences/shared_preferences_web/example/integration_test/shared_preferences_web_test.dart
+++ b/packages/shared_preferences/shared_preferences_web/example/integration_test/shared_preferences_web_test.dart
@@ -2,14 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'dart:html' as html;
-
 import 'package:flutter_test/flutter_test.dart';
 import 'package:integration_test/integration_test.dart';
 import 'package:shared_preferences_platform_interface/method_channel_shared_preferences.dart';
 import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart';
 import 'package:shared_preferences_platform_interface/types.dart';
 import 'package:shared_preferences_web/shared_preferences_web.dart';
+import 'package:shared_preferences_web/src/keys_extension.dart';
+
+import 'package:web/helpers.dart' as html;
 
 const Map<String, dynamic> kTestValues = <String, dynamic>{
   'flutter.String': 'hello world',
@@ -114,6 +115,15 @@
         allTestValues['flutter.StringList']!);
   }
 
+  testWidgets('keys', (WidgetTester _) async {
+    await addData();
+    final Iterable<String> keys = html.window.localStorage.keys;
+    final Iterable<String> expectedKeys = allTestValues.keys;
+
+    expect(keys, hasLength(expectedKeys.length));
+    expect(keys, containsAll(expectedKeys));
+  });
+
   testWidgets('clear', (WidgetTester _) async {
     await addData();
     await preferences.clear();
diff --git a/packages/shared_preferences/shared_preferences_web/example/pubspec.yaml b/packages/shared_preferences/shared_preferences_web/example/pubspec.yaml
index 826b38b..bf6ca2a 100644
--- a/packages/shared_preferences/shared_preferences_web/example/pubspec.yaml
+++ b/packages/shared_preferences/shared_preferences_web/example/pubspec.yaml
@@ -2,8 +2,8 @@
 publish_to: none
 
 environment:
-  sdk: ">=3.0.0 <4.0.0"
-  flutter: ">=3.10.0"
+  sdk: ">=3.2.0 <4.0.0"
+  flutter: ">=3.16.0"
 
 dependencies:
   flutter:
@@ -11,6 +11,7 @@
   shared_preferences_platform_interface: ^2.3.0
   shared_preferences_web:
     path: ../
+  web: '>=0.3.0 <0.5.0'
 
 dev_dependencies:
   flutter_test:
diff --git a/packages/shared_preferences/shared_preferences_web/lib/shared_preferences_web.dart b/packages/shared_preferences/shared_preferences_web/lib/shared_preferences_web.dart
index 34c33ce..b83c1a5 100644
--- a/packages/shared_preferences/shared_preferences_web/lib/shared_preferences_web.dart
+++ b/packages/shared_preferences/shared_preferences_web/lib/shared_preferences_web.dart
@@ -4,11 +4,13 @@
 
 import 'dart:async';
 import 'dart:convert' show json;
-import 'dart:html' as html;
 
 import 'package:flutter_web_plugins/flutter_web_plugins.dart';
 import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart';
 import 'package:shared_preferences_platform_interface/types.dart';
+import 'package:web/web.dart' as html;
+
+import 'src/keys_extension.dart';
 
 /// The web implementation of [SharedPreferencesStorePlatform].
 ///
@@ -43,7 +45,7 @@
     //            remove _all_ local data, not just the keys prefixed with
     //            _prefix
     _getFilteredKeys(filter.prefix, allowList: filter.allowList)
-        .forEach(html.window.localStorage.remove);
+        .forEach(remove);
     return true;
   }
 
@@ -69,20 +71,20 @@
     final Map<String, Object> allData = <String, Object>{};
     for (final String key
         in _getFilteredKeys(filter.prefix, allowList: filter.allowList)) {
-      allData[key] = _decodeValue(html.window.localStorage[key]!);
+      allData[key] = _decodeValue(html.window.localStorage.getItem(key)!);
     }
     return allData;
   }
 
   @override
   Future<bool> remove(String key) async {
-    html.window.localStorage.remove(key);
+    html.window.localStorage.removeItem(key);
     return true;
   }
 
   @override
   Future<bool> setValue(String valueType, String key, Object? value) async {
-    html.window.localStorage[key] = _encodeValue(value);
+    html.window.localStorage.setItem(key, _encodeValue(value));
     return true;
   }
 
diff --git a/packages/shared_preferences/shared_preferences_web/lib/src/keys_extension.dart b/packages/shared_preferences/shared_preferences_web/lib/src/keys_extension.dart
new file mode 100644
index 0000000..373ee96
--- /dev/null
+++ b/packages/shared_preferences/shared_preferences_web/lib/src/keys_extension.dart
@@ -0,0 +1,13 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:web/web.dart' as html;
+
+/// An extension on [html.Storage] that adds a convenience [keys] getter.
+extension KeysExtension on html.Storage {
+  /// Gets all the [keys] set in this [html.Storage].
+  List<String> get keys {
+    return <String>[for (int i = 0; i < length; i++) key(i)!];
+  }
+}
diff --git a/packages/shared_preferences/shared_preferences_web/pubspec.yaml b/packages/shared_preferences/shared_preferences_web/pubspec.yaml
index 2a64a80..ceb1dfe 100644
--- a/packages/shared_preferences/shared_preferences_web/pubspec.yaml
+++ b/packages/shared_preferences/shared_preferences_web/pubspec.yaml
@@ -2,11 +2,11 @@
 description: Web platform implementation of shared_preferences
 repository: https://github.com/flutter/packages/tree/main/packages/shared_preferences/shared_preferences_web
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+shared_preferences%22
-version: 2.2.1
+version: 2.2.2
 
 environment:
-  sdk: ">=3.0.0 <4.0.0"
-  flutter: ">=3.10.0"
+  sdk: ">=3.2.0 <4.0.0"
+  flutter: ">=3.16.0"
 
 flutter:
   plugin:
@@ -22,6 +22,7 @@
   flutter_web_plugins:
     sdk: flutter
   shared_preferences_platform_interface: ^2.3.0
+  web: '>=0.3.0 <0.5.0'
 
 dev_dependencies:
   flutter_test: