Skip to content

Commit 7af9a1a

Browse files
authored
Implement shared_preferences on top of platform interface (flutter#2325)
* implement shared_preferences on top of platform interface
1 parent e61e9d4 commit 7af9a1a

File tree

10 files changed

+117
-101
lines changed

10 files changed

+117
-101
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ keystore.properties
3030
gradlew
3131
gradlew.bat
3232
gradle-wrapper.jar
33+
.flutter-plugins-dependencies
3334
*.iml
3435

3536
GeneratedPluginRegistrant.h

packages/shared_preferences/analysis_options.yaml

Lines changed: 0 additions & 11 deletions
This file was deleted.

packages/shared_preferences/shared_preferences/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 0.5.4+8
2+
3+
* Switch `package:shared_preferences` to `package:shared_preferences_platform_interface`.
4+
No code changes are necessary in Flutter apps. This is not a breaking change.
5+
16
## 0.5.4+7
27

38
* Restructure the project for Web support.

packages/shared_preferences/shared_preferences/example/lib/main.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,14 @@ class SharedPreferencesDemoState extends State<SharedPreferencesDemo> {
6767
case ConnectionState.waiting:
6868
return const CircularProgressIndicator();
6969
default:
70-
if (snapshot.hasError)
70+
if (snapshot.hasError) {
7171
return Text('Error: ${snapshot.error}');
72-
else
72+
} else {
7373
return Text(
7474
'Button tapped ${snapshot.data} time${snapshot.data == 1 ? '' : 's'}.\n\n'
7575
'This should persist across restarts.',
7676
);
77+
}
7778
}
7879
})),
7980
floatingActionButton: FloatingActionButton(

packages/shared_preferences/shared_preferences/example/test_driver/shared_preferences_e2e.dart

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,23 +63,21 @@ void main() {
6363

6464
test('removing', () async {
6565
const String key = 'testKey';
66-
preferences
67-
..setString(key, kTestValues['flutter.String'])
68-
..setBool(key, kTestValues['flutter.bool'])
69-
..setInt(key, kTestValues['flutter.int'])
70-
..setDouble(key, kTestValues['flutter.double'])
71-
..setStringList(key, kTestValues['flutter.List']);
66+
await preferences.setString(key, kTestValues['flutter.String']);
67+
await preferences.setBool(key, kTestValues['flutter.bool']);
68+
await preferences.setInt(key, kTestValues['flutter.int']);
69+
await preferences.setDouble(key, kTestValues['flutter.double']);
70+
await preferences.setStringList(key, kTestValues['flutter.List']);
7271
await preferences.remove(key);
7372
expect(preferences.get('testKey'), isNull);
7473
});
7574

7675
test('clearing', () async {
77-
preferences
78-
..setString('String', kTestValues['flutter.String'])
79-
..setBool('bool', kTestValues['flutter.bool'])
80-
..setInt('int', kTestValues['flutter.int'])
81-
..setDouble('double', kTestValues['flutter.double'])
82-
..setStringList('List', kTestValues['flutter.List']);
76+
await preferences.setString('String', kTestValues['flutter.String']);
77+
await preferences.setBool('bool', kTestValues['flutter.bool']);
78+
await preferences.setInt('int', kTestValues['flutter.int']);
79+
await preferences.setDouble('double', kTestValues['flutter.double']);
80+
await preferences.setStringList('List', kTestValues['flutter.List']);
8381
await preferences.clear();
8482
expect(preferences.getString('String'), null);
8583
expect(preferences.getBool('bool'), null);

packages/shared_preferences/shared_preferences/example/test_driver/shared_preferences_e2e_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ Future<void> main() async {
1010
final FlutterDriver driver = await FlutterDriver.connect();
1111
final String result =
1212
await driver.requestData(null, timeout: const Duration(minutes: 1));
13-
driver.close();
13+
await driver.close();
1414
exit(result == 'pass' ? 0 : 1);
1515
}

packages/shared_preferences/shared_preferences/lib/shared_preferences.dart

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@
44

55
import 'dart:async';
66

7-
import 'package:flutter/services.dart';
87
import 'package:meta/meta.dart';
98

10-
const MethodChannel _kChannel =
11-
MethodChannel('plugins.flutter.io/shared_preferences');
9+
import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart';
1210

1311
/// Wraps NSUserDefaults (on iOS) and SharedPreferences (on Android), providing
1412
/// a persistent store for simple data.
@@ -20,6 +18,9 @@ class SharedPreferences {
2018
static const String _prefix = 'flutter.';
2119
static Completer<SharedPreferences> _completer;
2220

21+
static SharedPreferencesStorePlatform get _store =>
22+
SharedPreferencesStorePlatform.instance;
23+
2324
/// Loads and parses the [SharedPreferences] for this app from disk.
2425
///
2526
/// Because this is reading from disk, it shouldn't be awaited in
@@ -124,37 +125,30 @@ class SharedPreferences {
124125
Future<bool> remove(String key) => _setValue(null, key, null);
125126

126127
Future<bool> _setValue(String valueType, String key, Object value) {
127-
final Map<String, dynamic> params = <String, dynamic>{
128-
'key': '$_prefix$key',
129-
};
128+
final String prefixedKey = '$_prefix$key';
130129
if (value == null) {
131130
_preferenceCache.remove(key);
132-
return _kChannel
133-
.invokeMethod<bool>('remove', params)
134-
.then<bool>((dynamic result) => result);
131+
return _store.remove(prefixedKey);
135132
} else {
136133
if (value is List<String>) {
137134
// Make a copy of the list so that later mutations won't propagate
138135
_preferenceCache[key] = value.toList();
139136
} else {
140137
_preferenceCache[key] = value;
141138
}
142-
params['value'] = value;
143-
return _kChannel
144-
.invokeMethod<bool>('set$valueType', params)
145-
.then<bool>((dynamic result) => result);
139+
return _store.setValue(valueType, prefixedKey, value);
146140
}
147141
}
148142

149143
/// Always returns true.
150144
/// On iOS, synchronize is marked deprecated. On Android, we commit every set.
151145
@deprecated
152-
Future<bool> commit() async => await _kChannel.invokeMethod<bool>('commit');
146+
Future<bool> commit() async => true;
153147

154148
/// Completes with true once the user preferences for the app has been cleared.
155-
Future<bool> clear() async {
149+
Future<bool> clear() {
156150
_preferenceCache.clear();
157-
return await _kChannel.invokeMethod<bool>('clear');
151+
return _store.clear();
158152
}
159153

160154
/// Fetches the latest values from the host platform.
@@ -169,8 +163,7 @@ class SharedPreferences {
169163
}
170164

171165
static Future<Map<String, Object>> _getSharedPreferencesMap() async {
172-
final Map<String, Object> fromSystem =
173-
await _kChannel.invokeMapMethod<String, Object>('getAll');
166+
final Map<String, Object> fromSystem = await _store.getAll();
174167
assert(fromSystem != null);
175168
// Strip the flutter. prefix from the returned preferences.
176169
final Map<String, Object> preferencesMap = <String, Object>{};
@@ -194,12 +187,8 @@ class SharedPreferences {
194187
}
195188
return MapEntry<String, dynamic>(newKey, value);
196189
});
197-
_kChannel.setMockMethodCallHandler((MethodCall methodCall) async {
198-
if (methodCall.method == 'getAll') {
199-
return newValues;
200-
}
201-
return null;
202-
});
190+
SharedPreferencesStorePlatform.instance =
191+
InMemorySharedPreferencesStore.withData(newValues);
203192
_completer = null;
204193
}
205194
}

packages/shared_preferences/shared_preferences/pubspec.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ description: Flutter plugin for reading and writing simple key-value pairs.
33
Wraps NSUserDefaults on iOS and SharedPreferences on Android.
44
author: Flutter Team <flutter-dev@googlegroups.com>
55
homepage: https://github.com/flutter/plugins/tree/master/packages/shared_preferences/shared_preferences
6-
version: 0.5.4+7
6+
version: 0.5.4+8
77

88
flutter:
99
plugin:
@@ -15,6 +15,7 @@ dependencies:
1515
meta: ^1.0.4
1616
flutter:
1717
sdk: flutter
18+
shared_preferences_platform_interface: ^1.0.0
1819

1920
dev_dependencies:
2021
flutter_test:

0 commit comments

Comments
 (0)