From a6088c268625f7a6627419608cb44198182de899 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 16 Nov 2023 11:28:39 -0800 Subject: [PATCH 1/4] [shared_preferences_web] migrate to pkg:web --- .../shared_preferences_web/CHANGELOG.md | 4 ++-- .../lib/shared_preferences_web.dart | 17 +++++++++++++---- .../shared_preferences_web/pubspec.yaml | 7 ++++--- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/packages/shared_preferences/shared_preferences_web/CHANGELOG.md b/packages/shared_preferences/shared_preferences_web/CHANGELOG.md index 747f25adc43f..5f5d8c246cd6 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/lib/shared_preferences_web.dart b/packages/shared_preferences/shared_preferences_web/lib/shared_preferences_web.dart index 34c33ce82cfd..10bea9e2b369 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,11 @@ 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; /// The web implementation of [SharedPreferencesStorePlatform]. /// @@ -69,20 +69,20 @@ class SharedPreferencesPlugin extends SharedPreferencesStorePlatform { final Map allData = {}; 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 remove(String key) async { - html.window.localStorage.remove(key); + html.window.localStorage.removeItem(key); return true; } @override Future setValue(String valueType, String key, Object? value) async { - html.window.localStorage[key] = _encodeValue(value); + html.window.localStorage.setItem(key, _encodeValue(value)); return true; } @@ -111,3 +111,12 @@ class SharedPreferencesPlugin extends SharedPreferencesStorePlatform { return decodedValue!; } } + +extension on html.Storage { + void remove(String item) => removeItem(item); + Iterable get keys sync* { + for (int i = 0; i < html.window.localStorage.length; i++) { + yield html.window.localStorage.key(i)!; + } + } +} diff --git a/packages/shared_preferences/shared_preferences_web/pubspec.yaml b/packages/shared_preferences/shared_preferences_web/pubspec.yaml index 2a64a80e09c6..ceb1dfebcf7a 100644 --- a/packages/shared_preferences/shared_preferences_web/pubspec.yaml +++ b/packages/shared_preferences/shared_preferences_web/pubspec.yaml @@ -2,11 +2,11 @@ name: shared_preferences_web 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 @@ dependencies: flutter_web_plugins: sdk: flutter shared_preferences_platform_interface: ^2.3.0 + web: '>=0.3.0 <0.5.0' dev_dependencies: flutter_test: From e6bee3e96c917294090a011bce268b06c1c4a071 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Fri, 17 Nov 2023 19:19:11 -0800 Subject: [PATCH 2/4] Fix read-after-write issue on keys getter. --- .../lib/shared_preferences_web.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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 10bea9e2b369..0c134825ef7a 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 @@ -43,7 +43,7 @@ class SharedPreferencesPlugin extends SharedPreferencesStorePlatform { // 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; } @@ -113,10 +113,10 @@ class SharedPreferencesPlugin extends SharedPreferencesStorePlatform { } extension on html.Storage { - void remove(String item) => removeItem(item); - Iterable get keys sync* { - for (int i = 0; i < html.window.localStorage.length; i++) { - yield html.window.localStorage.key(i)!; - } + List get keys { + return [ + for (int i = 0; i < length; i++) + key(i)! + ]; } } From e72161a749f32021c13a80d660ec99cc512e044e Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Fri, 17 Nov 2023 19:21:31 -0800 Subject: [PATCH 3/4] dart format . --- .../shared_preferences_web/lib/shared_preferences_web.dart | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) 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 0c134825ef7a..251732d09f15 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 @@ -114,9 +114,6 @@ class SharedPreferencesPlugin extends SharedPreferencesStorePlatform { extension on html.Storage { List get keys { - return [ - for (int i = 0; i < length; i++) - key(i)! - ]; + return [for (int i = 0; i < length; i++) key(i)!]; } } From 86766284da1ca4de083086ca9022aedfc67dda3d Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Fri, 17 Nov 2023 19:54:31 -0800 Subject: [PATCH 4/4] Migrate tests to package:web, make the extension testable. --- .../shared_preferences_web_test.dart | 14 ++++++++++++-- .../shared_preferences_web/example/pubspec.yaml | 5 +++-- .../lib/shared_preferences_web.dart | 8 ++------ .../lib/src/keys_extension.dart | 13 +++++++++++++ 4 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 packages/shared_preferences/shared_preferences_web/lib/src/keys_extension.dart 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 53a47db784b1..b5f905bc966e 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 kTestValues = { 'flutter.String': 'hello world', @@ -114,6 +115,15 @@ void main() { allTestValues['flutter.StringList']!); } + testWidgets('keys', (WidgetTester _) async { + await addData(); + final Iterable keys = html.window.localStorage.keys; + final Iterable 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 826b38ba2a00..bf6ca2a883df 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 @@ name: shared_preferences_web_integration_tests 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 @@ dependencies: 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 251732d09f15..b83c1a5fe37e 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 @@ -10,6 +10,8 @@ import 'package:shared_preferences_platform_interface/shared_preferences_platfor 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]. /// /// This class implements the `package:shared_preferences` functionality for the web. @@ -111,9 +113,3 @@ class SharedPreferencesPlugin extends SharedPreferencesStorePlatform { return decodedValue!; } } - -extension on html.Storage { - List get keys { - return [for (int i = 0; i < length; i++) key(i)!]; - } -} 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 000000000000..373ee9660f88 --- /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 get keys { + return [for (int i = 0; i < length; i++) key(i)!]; + } +}