Skip to content

Commit 2b6addf

Browse files
authored
[shared_preferences] Migrate platform plugins to null-safety (flutter#3523)
Migrates shared_preferences_linux and shared_preferences_web to null-safety.
1 parent 7adfc2f commit 2b6addf

File tree

10 files changed

+93
-83
lines changed

10 files changed

+93
-83
lines changed

packages/shared_preferences/shared_preferences_linux/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.0.4-nullsafety
2+
3+
* Migrate to null-safety.
4+
15
## 0.0.3+1
26

37
* Update Flutter SDK constraint.
Lines changed: 47 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import 'dart:async';
2+
23
import 'package:flutter_test/flutter_test.dart';
3-
import 'package:shared_preferences/shared_preferences.dart';
44
import 'package:integration_test/integration_test.dart';
5+
import 'package:shared_preferences_linux/shared_preferences_linux.dart';
56

67
void main() {
78
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
89

9-
group('$SharedPreferences', () {
10+
group('SharedPreferencesLinux', () {
1011
const Map<String, dynamic> kTestValues = <String, dynamic>{
1112
'flutter.String': 'hello world',
1213
'flutter.bool': true,
@@ -23,67 +24,73 @@ void main() {
2324
'flutter.List': <String>['baz', 'quox'],
2425
};
2526

26-
SharedPreferences preferences;
27+
SharedPreferencesLinux preferences;
2728

2829
setUp(() async {
29-
preferences = await SharedPreferences.getInstance();
30+
preferences = SharedPreferencesLinux.instance;
3031
});
3132

3233
tearDown(() {
3334
preferences.clear();
3435
});
3536

3637
testWidgets('reading', (WidgetTester _) async {
37-
expect(preferences.get('String'), isNull);
38-
expect(preferences.get('bool'), isNull);
39-
expect(preferences.get('int'), isNull);
40-
expect(preferences.get('double'), isNull);
41-
expect(preferences.get('List'), isNull);
42-
expect(preferences.getString('String'), isNull);
43-
expect(preferences.getBool('bool'), isNull);
44-
expect(preferences.getInt('int'), isNull);
45-
expect(preferences.getDouble('double'), isNull);
46-
expect(preferences.getStringList('List'), isNull);
38+
final all = await preferences.getAll();
39+
expect(all['String'], isNull);
40+
expect(all['bool'], isNull);
41+
expect(all['int'], isNull);
42+
expect(all['double'], isNull);
43+
expect(all['List'], isNull);
4744
});
4845

4946
testWidgets('writing', (WidgetTester _) async {
5047
await Future.wait(<Future<bool>>[
51-
preferences.setString('String', kTestValues2['flutter.String']),
52-
preferences.setBool('bool', kTestValues2['flutter.bool']),
53-
preferences.setInt('int', kTestValues2['flutter.int']),
54-
preferences.setDouble('double', kTestValues2['flutter.double']),
55-
preferences.setStringList('List', kTestValues2['flutter.List'])
48+
preferences.setValue(
49+
'String', 'String', kTestValues2['flutter.String']),
50+
preferences.setValue('Bool', 'bool', kTestValues2['flutter.bool']),
51+
preferences.setValue('Int', 'int', kTestValues2['flutter.int']),
52+
preferences.setValue(
53+
'Double', 'double', kTestValues2['flutter.double']),
54+
preferences.setValue('StringList', 'List', kTestValues2['flutter.List'])
5655
]);
57-
expect(preferences.getString('String'), kTestValues2['flutter.String']);
58-
expect(preferences.getBool('bool'), kTestValues2['flutter.bool']);
59-
expect(preferences.getInt('int'), kTestValues2['flutter.int']);
60-
expect(preferences.getDouble('double'), kTestValues2['flutter.double']);
61-
expect(preferences.getStringList('List'), kTestValues2['flutter.List']);
56+
final all = await preferences.getAll();
57+
expect(all['String'], kTestValues2['flutter.String']);
58+
expect(all['bool'], kTestValues2['flutter.bool']);
59+
expect(all['int'], kTestValues2['flutter.int']);
60+
expect(all['double'], kTestValues2['flutter.double']);
61+
expect(all['List'], kTestValues2['flutter.List']);
6262
});
6363

6464
testWidgets('removing', (WidgetTester _) async {
6565
const String key = 'testKey';
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']);
66+
67+
await Future.wait([
68+
preferences.setValue('String', key, kTestValues['flutter.String']),
69+
preferences.setValue('Bool', key, kTestValues['flutter.bool']),
70+
preferences.setValue('Int', key, kTestValues['flutter.int']),
71+
preferences.setValue('Double', key, kTestValues['flutter.double']),
72+
preferences.setValue('StringList', key, kTestValues['flutter.List'])
73+
]);
7174
await preferences.remove(key);
72-
expect(preferences.get('testKey'), isNull);
75+
final all = await preferences.getAll();
76+
expect(all['testKey'], isNull);
7377
});
7478

7579
testWidgets('clearing', (WidgetTester _) async {
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']);
80+
await Future.wait(<Future<bool>>[
81+
preferences.setValue('String', 'String', kTestValues['flutter.String']),
82+
preferences.setValue('Bool', 'bool', kTestValues['flutter.bool']),
83+
preferences.setValue('Int', 'int', kTestValues['flutter.int']),
84+
preferences.setValue('Double', 'double', kTestValues['flutter.double']),
85+
preferences.setValue('StringList', 'List', kTestValues['flutter.List'])
86+
]);
8187
await preferences.clear();
82-
expect(preferences.getString('String'), null);
83-
expect(preferences.getBool('bool'), null);
84-
expect(preferences.getInt('int'), null);
85-
expect(preferences.getDouble('double'), null);
86-
expect(preferences.getStringList('List'), null);
88+
final all = await preferences.getAll();
89+
expect(all['String'], null);
90+
expect(all['bool'], null);
91+
expect(all['int'], null);
92+
expect(all['double'], null);
93+
expect(all['List'], null);
8794
});
8895
});
8996
}

packages/shared_preferences/shared_preferences_linux/example/pubspec.yaml

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,8 @@ description: Demonstrates how to use the shared_preferences_linux plugin.
44
dependencies:
55
flutter:
66
sdk: flutter
7-
shared_preferences: any
8-
shared_preferences_linux: ^0.1.0
9-
10-
dependency_overrides:
117
shared_preferences_linux:
128
path: ../
13-
# Remove this override once the endorsement is published.
14-
shared_preferences:
15-
path: ../../shared_preferences/
169

1710
dev_dependencies:
1811
flutter_driver:

packages/shared_preferences/shared_preferences_linux/lib/shared_preferences_linux.dart

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,43 +20,48 @@ class SharedPreferencesLinux extends SharedPreferencesStorePlatform {
2020
static SharedPreferencesLinux instance = SharedPreferencesLinux();
2121

2222
/// Local copy of preferences
23-
Map<String, Object> _cachedPreferences;
23+
Map<String, Object>? _cachedPreferences;
2424

2525
/// File system used to store to disk. Exposed for testing only.
2626
@visibleForTesting
2727
FileSystem fs = LocalFileSystem();
2828

2929
/// Gets the file where the preferences are stored.
30-
Future<File> _getLocalDataFile() async {
30+
Future<File?> _getLocalDataFile() async {
3131
final pathProvider = PathProviderLinux();
3232
final directory = await pathProvider.getApplicationSupportPath();
33+
if (directory == null) return null;
3334
return fs.file(path.join(directory, 'shared_preferences.json'));
3435
}
3536

3637
/// Gets the preferences from the stored file. Once read, the preferences are
3738
/// maintained in memory.
3839
Future<Map<String, Object>> _readPreferences() async {
3940
if (_cachedPreferences != null) {
40-
return _cachedPreferences;
41+
return _cachedPreferences!;
4142
}
4243

43-
_cachedPreferences = {};
44-
var localDataFile = await _getLocalDataFile();
45-
if (localDataFile.existsSync()) {
44+
Map<String, Object> preferences = {};
45+
final File? localDataFile = await _getLocalDataFile();
46+
if (localDataFile != null && localDataFile.existsSync()) {
4647
String stringMap = localDataFile.readAsStringSync();
4748
if (stringMap.isNotEmpty) {
48-
_cachedPreferences = json.decode(stringMap) as Map<String, Object>;
49+
preferences = json.decode(stringMap).cast<String, Object>();
4950
}
5051
}
51-
52-
return _cachedPreferences;
52+
_cachedPreferences = preferences;
53+
return preferences;
5354
}
5455

5556
/// Writes the cached preferences to disk. Returns [true] if the operation
5657
/// succeeded.
5758
Future<bool> _writePreferences(Map<String, Object> preferences) async {
5859
try {
5960
var localDataFile = await _getLocalDataFile();
61+
if (localDataFile == null) {
62+
print("Unable to determine where to write preferences.");
63+
return false;
64+
}
6065
if (!localDataFile.existsSync()) {
6166
localDataFile.createSync(recursive: true);
6267
}

packages/shared_preferences/shared_preferences_linux/pubspec.yaml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: shared_preferences_linux
22
description: Linux implementation of the shared_preferences plugin
3-
version: 0.0.3+1
3+
version: 0.0.4-nullsafety
44
homepage: https://github.com/flutter/plugins/tree/master/packages/shared_preferences/shared_preferences_linux
55

66
flutter:
@@ -11,17 +11,17 @@ flutter:
1111
pluginClass: none
1212

1313
environment:
14-
sdk: ">=2.1.0 <3.0.0"
14+
sdk: ">=2.12.0-0 <3.0.0"
1515
flutter: ">=1.12.8"
1616

1717
dependencies:
18-
file: ">=5.1.0 <7.0.0"
1918
flutter:
2019
sdk: flutter
20+
file: ^6.0.0-nullsafety.4
2121
meta: ^1.0.4
22-
path: ^1.6.4
23-
path_provider_linux: ^0.0.1
24-
shared_preferences_platform_interface: ^1.0.0
22+
path: ^1.8.0-nullsafety.3
23+
path_provider_linux: ^0.2.0-nullsafety
24+
shared_preferences_platform_interface: ^2.0.0-nullsafety
2525

2626
dev_dependencies:
2727
flutter_test:

packages/shared_preferences/shared_preferences_linux/test/shared_preferences_linux_test.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import 'package:path/path.dart' as path;
77
import 'package:path_provider_linux/path_provider_linux.dart';
88
import 'package:shared_preferences_linux/shared_preferences_linux.dart';
99

10-
MemoryFileSystem fs;
11-
1210
void main() {
11+
late MemoryFileSystem fs;
12+
1313
setUp(() {
1414
fs = MemoryFileSystem.test();
1515
});
@@ -19,7 +19,7 @@ void main() {
1919
Future<String> _getFilePath() async {
2020
final pathProvider = PathProviderLinux();
2121
final directory = await pathProvider.getApplicationSupportPath();
22-
return path.join(directory, 'shared_preferences.json');
22+
return path.join(directory!, 'shared_preferences.json');
2323
}
2424

2525
_writeTestFile(String value) async {

packages/shared_preferences/shared_preferences_web/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.2.0-nullsafety
2+
3+
* Migrate to null-safety.
4+
15
## 0.1.2+8
26

37
* Update Flutter SDK constraint.

packages/shared_preferences/shared_preferences_web/lib/shared_preferences_web.dart

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import 'package:shared_preferences_platform_interface/shared_preferences_platfor
1414
/// This class implements the `package:shared_preferences` functionality for the web.
1515
class SharedPreferencesPlugin extends SharedPreferencesStorePlatform {
1616
/// Registers this class as the default instance of [SharedPreferencesStorePlatform].
17-
static void registerWith(Registrar registrar) {
17+
static void registerWith(Registrar? registrar) {
1818
SharedPreferencesStorePlatform.instance = SharedPreferencesPlugin();
1919
}
2020

@@ -31,9 +31,9 @@ class SharedPreferencesPlugin extends SharedPreferencesStorePlatform {
3131

3232
@override
3333
Future<Map<String, Object>> getAll() async {
34-
final Map<String, Object> allData = <String, Object>{};
34+
final Map<String, Object> allData = {};
3535
for (String key in _storedFlutterKeys) {
36-
allData[key] = _decodeValue(html.window.localStorage[key]);
36+
allData[key] = _decodeValue(html.window.localStorage[key]!);
3737
}
3838
return allData;
3939
}
@@ -46,7 +46,7 @@ class SharedPreferencesPlugin extends SharedPreferencesStorePlatform {
4646
}
4747

4848
@override
49-
Future<bool> setValue(String valueType, String key, Object value) async {
49+
Future<bool> setValue(String valueType, String key, Object? value) async {
5050
_checkPrefix(key);
5151
html.window.localStorage[key] = _encodeValue(value);
5252
return true;
@@ -62,17 +62,12 @@ class SharedPreferencesPlugin extends SharedPreferencesStorePlatform {
6262
}
6363
}
6464

65-
List<String> get _storedFlutterKeys {
66-
final List<String> keys = <String>[];
67-
for (String key in html.window.localStorage.keys) {
68-
if (key.startsWith('flutter.')) {
69-
keys.add(key);
70-
}
71-
}
72-
return keys;
65+
Iterable<String> get _storedFlutterKeys {
66+
return html.window.localStorage.keys
67+
.where((key) => key.startsWith('flutter.'));
7368
}
7469

75-
String _encodeValue(Object value) {
70+
String _encodeValue(Object? value) {
7671
return json.encode(value);
7772
}
7873

packages/shared_preferences/shared_preferences_web/pubspec.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ homepage: https://github.com/flutter/plugins/tree/master/packages/shared_prefere
44
# 0.1.y+z is compatible with 1.0.0, if you land a breaking change bump
55
# the version to 2.0.0.
66
# See more details: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0
7-
version: 0.1.2+8
7+
version: 0.2.0-nullsafety
88

99
flutter:
1010
plugin:
@@ -14,7 +14,7 @@ flutter:
1414
fileName: shared_preferences_web.dart
1515

1616
dependencies:
17-
shared_preferences_platform_interface: ^1.0.0
17+
shared_preferences_platform_interface: ^2.0.0-nullsafety
1818
flutter:
1919
sdk: flutter
2020
flutter_web_plugins:
@@ -27,5 +27,5 @@ dev_dependencies:
2727
pedantic: ^1.8.0
2828

2929
environment:
30-
sdk: ">=2.1.0 <3.0.0"
30+
sdk: ">=2.12.0-0 <3.0.0"
3131
flutter: ">=1.12.13+hotfix.4"

packages/shared_preferences/shared_preferences_web/test/shared_preferences_web_test.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5-
@TestOn('chrome') // Uses web-only Flutter SDK
6-
5+
@TestOn('chrome')
76
import 'dart:convert' show json;
87
import 'dart:html' as html;
98

109
import 'package:flutter_test/flutter_test.dart';
10+
import 'package:shared_preferences_platform_interface/method_channel_shared_preferences.dart';
1111
import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart';
1212
import 'package:shared_preferences_web/shared_preferences_web.dart';
1313

@@ -26,6 +26,8 @@ void main() {
2626
});
2727

2828
test('registers itself', () {
29+
SharedPreferencesStorePlatform.instance =
30+
MethodChannelSharedPreferencesStore();
2931
expect(SharedPreferencesStorePlatform.instance,
3032
isNot(isA<SharedPreferencesPlugin>()));
3133
SharedPreferencesPlugin.registerWith(null);

0 commit comments

Comments
 (0)