Skip to content

Commit cdd6e13

Browse files
authored
[shared_preferences] fix cast error and mutable list error with getStringList (#7355)
fixes flutter/flutter#153106 fixes flutter/flutter#153112 Will add a follow up pr adding a test to the top level package after this pr lands.
1 parent f7b1256 commit cdd6e13

File tree

20 files changed

+123
-22
lines changed

20 files changed

+123
-22
lines changed

packages/shared_preferences/shared_preferences_android/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 2.3.1
2+
3+
* Fixes `getStringList` returning immutable list.
4+
15
## 2.3.0
26

37
* Adds new `SharedPreferencesAsyncAndroid` API.

packages/shared_preferences/shared_preferences_android/example/integration_test/shared_preferences_test.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,16 @@ void main() {
555555
expect(await preferences.getStringList(listKey, emptyOptions), testList);
556556
});
557557

558+
testWidgets('getStringList returns mutable list', (WidgetTester _) async {
559+
final SharedPreferencesAsyncPlatform preferences = await getPreferences();
560+
561+
await preferences.setStringList(listKey, testList, emptyOptions);
562+
final List<String>? list =
563+
await preferences.getStringList(listKey, emptyOptions);
564+
list?.add('value');
565+
expect(list?.length, testList.length + 1);
566+
});
567+
558568
testWidgets('getPreferences', (WidgetTester _) async {
559569
final SharedPreferencesAsyncPlatform preferences = await getPreferences();
560570
await Future.wait(<Future<void>>[

packages/shared_preferences/shared_preferences_android/lib/src/shared_preferences_async_android.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ base class SharedPreferencesAsyncAndroid
146146
// is fixed. In practice, the values will never be null, and the native implementation assumes that.
147147
return _convertKnownExceptions<List<String>>(() async =>
148148
(await _api.getStringList(key, _convertOptionsToPigeonOptions(options)))
149-
?.cast<String>());
149+
?.cast<String>()
150+
.toList());
150151
}
151152

152153
Future<T?> _convertKnownExceptions<T>(Future<T?> Function() method) async {

packages/shared_preferences/shared_preferences_android/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: shared_preferences_android
22
description: Android implementation of the shared_preferences plugin
33
repository: https://github.com/flutter/packages/tree/main/packages/shared_preferences/shared_preferences_android
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+shared_preferences%22
5-
version: 2.3.0
5+
version: 2.3.1
66

77
environment:
88
sdk: ^3.4.0

packages/shared_preferences/shared_preferences_foundation/CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
## NEXT
1+
## 2.5.1
22

3+
* Fixes `getStringList` returning immutable list.
34
* Updates minimum supported SDK version to Flutter 3.19/Dart 3.3.
45

56
## 2.5.0

packages/shared_preferences/shared_preferences_foundation/example/integration_test/shared_preferences_test.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,16 @@ void main() {
544544
expect(await preferences.getStringList(listKey, emptyOptions), testList);
545545
});
546546

547+
testWidgets('getStringList returns mutable list', (WidgetTester _) async {
548+
final SharedPreferencesAsyncPlatform preferences = await getPreferences();
549+
550+
await preferences.setStringList(listKey, testList, emptyOptions);
551+
final List<String>? list =
552+
await preferences.getStringList(listKey, emptyOptions);
553+
list?.add('value');
554+
expect(list?.length, testList.length + 1);
555+
});
556+
547557
testWidgets('getPreferences', (WidgetTester _) async {
548558
final SharedPreferencesAsyncPlatform preferences = await getPreferences();
549559
await Future.wait(<Future<void>>[

packages/shared_preferences/shared_preferences_foundation/lib/src/shared_preferences_async_foundation.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,8 @@ base class SharedPreferencesAsyncFoundation
158158
return _convertKnownExceptions<List<String>>(() async =>
159159
((await _api.getValue(key, _convertOptionsToPigeonOptions(options)))
160160
as List<Object?>?)
161-
?.cast<String>());
161+
?.cast<String>()
162+
.toList());
162163
}
163164

164165
@override

packages/shared_preferences/shared_preferences_foundation/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: shared_preferences_foundation
22
description: iOS and macOS implementation of the shared_preferences plugin.
33
repository: https://github.com/flutter/packages/tree/main/packages/shared_preferences/shared_preferences_foundation
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+shared_preferences%22
5-
version: 2.5.0
5+
version: 2.5.1
66

77
environment:
88
sdk: ^3.3.0

packages/shared_preferences/shared_preferences_linux/CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
## NEXT
1+
## 2.4.1
22

3+
* Fixes `getStringList` returning immutable list.
4+
* Fixes `getStringList` cast error.
35
* Updates minimum supported SDK version to Flutter 3.19/Dart 3.3.
46

57
## 2.4.0

packages/shared_preferences/shared_preferences_linux/example/integration_test/shared_preferences_test.dart

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -354,12 +354,15 @@ void main() {
354354
const double testDouble = 3.14159;
355355
const List<String> testList = <String>['foo', 'bar'];
356356

357-
Future<SharedPreferencesAsyncPlatform> getPreferences() async {
357+
Future<SharedPreferencesAsyncPlatform> getPreferences(
358+
{bool clear = true}) async {
358359
final SharedPreferencesAsyncPlatform preferences =
359360
SharedPreferencesAsyncPlatform.instance!;
360-
await preferences.clear(
361-
const ClearPreferencesParameters(filter: PreferencesFilters()),
362-
emptyOptions);
361+
if (clear) {
362+
await preferences.clear(
363+
const ClearPreferencesParameters(filter: PreferencesFilters()),
364+
emptyOptions);
365+
}
363366
return preferences;
364367
}
365368

@@ -397,6 +400,24 @@ void main() {
397400
await preferences.setStringList(listKey, testList, emptyOptions);
398401
expect(await preferences.getStringList(listKey, emptyOptions), testList);
399402
});
403+
testWidgets('getStringList does not throw cast error',
404+
(WidgetTester _) async {
405+
final SharedPreferencesAsyncPlatform preferences = await getPreferences();
406+
407+
await preferences.setStringList(listKey, testList, emptyOptions);
408+
await (preferences as SharedPreferencesAsyncLinux).reload(emptyOptions);
409+
expect(await preferences.getStringList(listKey, emptyOptions), testList);
410+
});
411+
412+
testWidgets('getStringList returns mutable list', (WidgetTester _) async {
413+
final SharedPreferencesAsyncPlatform preferences = await getPreferences();
414+
415+
await preferences.setStringList(listKey, testList, emptyOptions);
416+
final List<String>? list =
417+
await preferences.getStringList(listKey, emptyOptions);
418+
list?.add('value');
419+
expect(list?.length, testList.length + 1);
420+
});
400421

401422
testWidgets('getPreferences', (WidgetTester _) async {
402423
final SharedPreferencesAsyncPlatform preferences = await getPreferences();

0 commit comments

Comments
 (0)