diff --git a/packages/shared_preferences/shared_preferences_web/CHANGELOG.md b/packages/shared_preferences/shared_preferences_web/CHANGELOG.md index 5f5d8c246cd6..a188c2f19660 100644 --- a/packages/shared_preferences/shared_preferences_web/CHANGELOG.md +++ b/packages/shared_preferences/shared_preferences_web/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.2.3 + +* Fixes shared_preferences_web issue where non-JSON formatted strings cause parsing errors when `getAllWithParameters` is called. + ## 2.2.2 * Updates minimum supported SDK version to Dart 3.2. 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 b83c1a5fe37e..46b06bd50c3d 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 @@ -100,16 +100,33 @@ class SharedPreferencesPlugin extends SharedPreferencesStorePlatform { return json.encode(value); } - Object _decodeValue(String encodedValue) { - final Object? decodedValue = json.decode(encodedValue); - if (decodedValue is List) { - // JSON does not preserve generics. The encode/decode roundtrip is - // `List` => JSON => `List`. We have to explicitly - // restore the RTTI. - return decodedValue.cast(); + Object _decodeValue(String encodedValue) { + try { + // Attempt to decode the string as JSON + final Object? decodedValue = json.decode(encodedValue); + + if (decodedValue is List) { + // JSON does not preserve generics. The encode/decode roundtrip results in + // `List` => JSON => `List`. Explicit restoration of RTTI is required. + return decodedValue.cast(); + } + + return decodedValue!; + } on FormatException { + // If there is a FormatException, try adding double quotes and parsing again + try { + return json.decode('\"$encodedValue\"'); + } catch (e) { + // If parsing still fails, return the original string + // This indicates the string may not be a valid JSON format + return encodedValue; + } + } catch (e) { + // Print the exception and return an empty string + print(e.toString()); + return ''; } - - return decodedValue!; } + } diff --git a/packages/shared_preferences/shared_preferences_web/pubspec.yaml b/packages/shared_preferences/shared_preferences_web/pubspec.yaml index ceb1dfebcf7a..6f851ec66ca7 100644 --- a/packages/shared_preferences/shared_preferences_web/pubspec.yaml +++ b/packages/shared_preferences/shared_preferences_web/pubspec.yaml @@ -2,7 +2,7 @@ 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.2 +version: 2.2.3 environment: sdk: ">=3.2.0 <4.0.0"