[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: