From 3e1cedb62e246e45254f27f17474eef2392e65dc Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 18 Feb 2021 13:24:09 -0800 Subject: [PATCH 1/4] fix crash when list type is dynaimc --- packages/in_app_purchase/example/pubspec.yaml | 5 +++++ .../shared_preferences/shared_preferences/CHANGELOG.md | 4 ++++ .../shared_preferences/lib/shared_preferences.dart | 8 ++++++-- .../shared_preferences/shared_preferences/pubspec.yaml | 2 +- .../shared_preferences/test/shared_preferences_test.dart | 9 +++++++++ 5 files changed, 25 insertions(+), 3 deletions(-) diff --git a/packages/in_app_purchase/example/pubspec.yaml b/packages/in_app_purchase/example/pubspec.yaml index 9b623a15795a..01cbda221ba1 100644 --- a/packages/in_app_purchase/example/pubspec.yaml +++ b/packages/in_app_purchase/example/pubspec.yaml @@ -5,8 +5,13 @@ author: Flutter Team dependencies: flutter: sdk: flutter +<<<<<<< Updated upstream cupertino_icons: ^0.1.2 shared_preferences: ^0.5.2 +======= + shared_preferences: + path: ../../shared_preferences/shared_preferences +>>>>>>> Stashed changes dev_dependencies: test: ^1.5.2 diff --git a/packages/shared_preferences/shared_preferences/CHANGELOG.md b/packages/shared_preferences/shared_preferences/CHANGELOG.md index 1f003ef5b133..a14ebf547659 100644 --- a/packages/shared_preferences/shared_preferences/CHANGELOG.md +++ b/packages/shared_preferences/shared_preferences/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.0-nullsafety.1 + +* Fix crash when list string's type is dynamic. + ## 2.0.0-nullsafety * Migrate to null-safety. diff --git a/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart b/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart index 03619fd14b4f..1e87b3e4354c 100644 --- a/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart +++ b/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart @@ -107,13 +107,17 @@ class SharedPreferences { /// Reads a set of string values from persistent storage, throwing an /// exception if it's not a string set. List? getStringList(String key) { - List? list = _preferenceCache[key] as List?; + final Object? rawValue = _preferenceCache[key]; + if (rawValue == null) { + return null; + } + List? list = List.castFrom(rawValue as List); if (list != null && list is! List) { list = list.cast().toList(); _preferenceCache[key] = list; } // Make a copy of the list so that later mutations won't propagate - return list?.toList() as List?; + return list.toList() as List?; } /// Saves a boolean [value] to persistent storage in the background. diff --git a/packages/shared_preferences/shared_preferences/pubspec.yaml b/packages/shared_preferences/shared_preferences/pubspec.yaml index 1bf314cadcfa..fc556972a847 100644 --- a/packages/shared_preferences/shared_preferences/pubspec.yaml +++ b/packages/shared_preferences/shared_preferences/pubspec.yaml @@ -2,7 +2,7 @@ name: shared_preferences description: Flutter plugin for reading and writing simple key-value pairs. Wraps NSUserDefaults on iOS and SharedPreferences on Android. homepage: https://github.com/flutter/plugins/tree/master/packages/shared_preferences/shared_preferences -version: 2.0.0-nullsafety +version: 2.0.0-nullsafety.1 flutter: plugin: diff --git a/packages/shared_preferences/shared_preferences/test/shared_preferences_test.dart b/packages/shared_preferences/shared_preferences/test/shared_preferences_test.dart index 9f6e7203fa85..e567a2981aab 100755 --- a/packages/shared_preferences/shared_preferences/test/shared_preferences_test.dart +++ b/packages/shared_preferences/shared_preferences/test/shared_preferences_test.dart @@ -39,6 +39,7 @@ void main() { tearDown(() async { await preferences.clear(); + await store.clear(); }); test('reading', () async { @@ -156,6 +157,14 @@ void main() { expect(await first, await second); }); + test('string list type is dynamic (usually from method channel)', () async { + SharedPreferences.setMockInitialValues( + {'dynamic_list': ['1', '2']}); + final SharedPreferences prefs = await SharedPreferences.getInstance(); + final List? value = prefs.getStringList('dynamic_list'); + expect(value, ['1', '2']); + }); + group('mocking', () { const String _key = 'dummy'; const String _prefixedKey = 'flutter.' + _key; From 7f93b216bcb02f7c0832e827b6d416d3b1a31612 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 18 Feb 2021 13:26:44 -0800 Subject: [PATCH 2/4] recert --- packages/in_app_purchase/example/pubspec.yaml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/in_app_purchase/example/pubspec.yaml b/packages/in_app_purchase/example/pubspec.yaml index 01cbda221ba1..9b623a15795a 100644 --- a/packages/in_app_purchase/example/pubspec.yaml +++ b/packages/in_app_purchase/example/pubspec.yaml @@ -5,13 +5,8 @@ author: Flutter Team dependencies: flutter: sdk: flutter -<<<<<<< Updated upstream cupertino_icons: ^0.1.2 shared_preferences: ^0.5.2 -======= - shared_preferences: - path: ../../shared_preferences/shared_preferences ->>>>>>> Stashed changes dev_dependencies: test: ^1.5.2 From 828f399068c5ced21b3ac4c6b48f93a00aae1293 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 18 Feb 2021 13:29:57 -0800 Subject: [PATCH 3/4] format --- .../shared_preferences/lib/shared_preferences.dart | 3 ++- .../shared_preferences/test/shared_preferences_test.dart | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart b/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart index 1e87b3e4354c..6c830d0222cb 100644 --- a/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart +++ b/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart @@ -111,7 +111,8 @@ class SharedPreferences { if (rawValue == null) { return null; } - List? list = List.castFrom(rawValue as List); + List? list = + List.castFrom(rawValue as List); if (list != null && list is! List) { list = list.cast().toList(); _preferenceCache[key] = list; diff --git a/packages/shared_preferences/shared_preferences/test/shared_preferences_test.dart b/packages/shared_preferences/shared_preferences/test/shared_preferences_test.dart index e567a2981aab..7866b2e38fac 100755 --- a/packages/shared_preferences/shared_preferences/test/shared_preferences_test.dart +++ b/packages/shared_preferences/shared_preferences/test/shared_preferences_test.dart @@ -158,8 +158,9 @@ void main() { }); test('string list type is dynamic (usually from method channel)', () async { - SharedPreferences.setMockInitialValues( - {'dynamic_list': ['1', '2']}); + SharedPreferences.setMockInitialValues({ + 'dynamic_list': ['1', '2'] + }); final SharedPreferences prefs = await SharedPreferences.getInstance(); final List? value = prefs.getStringList('dynamic_list'); expect(value, ['1', '2']); From c0f4ed89001eefb91e860cf56778439bd8dcc0e3 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 18 Feb 2021 14:05:47 -0800 Subject: [PATCH 4/4] review --- .../shared_preferences/lib/shared_preferences.dart | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart b/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart index 6c830d0222cb..2f4ebe730351 100644 --- a/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart +++ b/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart @@ -107,18 +107,13 @@ class SharedPreferences { /// Reads a set of string values from persistent storage, throwing an /// exception if it's not a string set. List? getStringList(String key) { - final Object? rawValue = _preferenceCache[key]; - if (rawValue == null) { - return null; - } - List? list = - List.castFrom(rawValue as List); + List? list = _preferenceCache[key] as List?; if (list != null && list is! List) { list = list.cast().toList(); _preferenceCache[key] = list; } // Make a copy of the list so that later mutations won't propagate - return list.toList() as List?; + return list?.toList() as List?; } /// Saves a boolean [value] to persistent storage in the background.