Skip to content

Commit d2c011f

Browse files
[shared_preferences] Migrate examples to NNBD (flutter#3564)
Migrate all examples to NNBD so that the example apps will run in strong mode. Converts macOS example to use the platform interface to remove circular dependencies (code is based on the Linux and Windows versions which already use essentially that approach).
1 parent 4290d18 commit d2c011f

File tree

19 files changed

+138
-92
lines changed

19 files changed

+138
-92
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
// Copyright 2017 The Chromium Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
// @dart=2.9
6+
17
import 'dart:async';
28
import 'package:flutter_test/flutter_test.dart';
39
import 'package:shared_preferences/shared_preferences.dart';

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,15 @@ class MyApp extends StatelessWidget {
2424
}
2525

2626
class SharedPreferencesDemo extends StatefulWidget {
27-
SharedPreferencesDemo({Key key}) : super(key: key);
27+
SharedPreferencesDemo({Key? key}) : super(key: key);
2828

2929
@override
3030
SharedPreferencesDemoState createState() => SharedPreferencesDemoState();
3131
}
3232

3333
class SharedPreferencesDemoState extends State<SharedPreferencesDemo> {
3434
Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
35-
Future<int> _counter;
35+
late Future<int> _counter;
3636

3737
Future<void> _incrementCounter() async {
3838
final SharedPreferences prefs = await _prefs;

packages/shared_preferences/shared_preferences/example/pubspec.yaml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,5 @@ flutter:
2323
uses-material-design: true
2424

2525
environment:
26-
sdk: ">=2.0.0-dev.28.0 <3.0.0"
26+
sdk: ">=2.12.0-0 <3.0.0"
2727
flutter: ">=1.9.1+hotfix.2"
28-

packages/shared_preferences/shared_preferences/example/test_driver/integration_test.dart

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

5+
// @dart=2.9
6+
57
import 'dart:async';
68
import 'dart:convert';
79
import 'dart:io';

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
// Copyright 2017 The Chromium Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
// @dart=2.9
6+
17
import 'dart:async';
28

39
import 'package:flutter_test/flutter_test.dart';

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,22 @@ class MyApp extends StatelessWidget {
2424
}
2525

2626
class SharedPreferencesDemo extends StatefulWidget {
27-
SharedPreferencesDemo({Key key}) : super(key: key);
27+
SharedPreferencesDemo({Key? key}) : super(key: key);
2828

2929
@override
3030
SharedPreferencesDemoState createState() => SharedPreferencesDemoState();
3131
}
3232

3333
class SharedPreferencesDemoState extends State<SharedPreferencesDemo> {
3434
final prefs = SharedPreferencesLinux.instance;
35-
Future<int> _counter;
35+
late Future<int> _counter;
3636

3737
Future<void> _incrementCounter() async {
3838
final values = await prefs.getAll();
39-
final int counter = (values['counter'] as int ?? 0) + 1;
39+
final int counter = (values['counter'] as int? ?? 0) + 1;
4040

4141
setState(() {
42-
_counter = prefs.setValue(null, "counter", counter).then((bool success) {
42+
_counter = prefs.setValue('Int', 'counter', counter).then((bool success) {
4343
return counter;
4444
});
4545
});
@@ -49,7 +49,7 @@ class SharedPreferencesDemoState extends State<SharedPreferencesDemo> {
4949
void initState() {
5050
super.initState();
5151
_counter = prefs.getAll().then((Map<String, Object> values) {
52-
return (values['counter'] ?? 0);
52+
return (values['counter'] as int? ?? 0);
5353
});
5454
}
5555

packages/shared_preferences/shared_preferences_linux/example/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,5 @@ flutter:
2323
uses-material-design: true
2424

2525
environment:
26-
sdk: ">=2.1.0 <3.0.0"
26+
sdk: ">=2.12.0-0 <3.0.0"
2727
flutter: ">=1.12.8"

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

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

5+
// @dart=2.9
6+
57
import 'dart:async';
68
import 'dart:convert';
79
import 'dart:io';
Lines changed: 65 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
1+
// Copyright 2017, the Chromium project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
// @dart=2.9
6+
17
import 'dart:async';
28
import 'package:flutter_test/flutter_test.dart';
3-
import 'package:shared_preferences/shared_preferences.dart';
9+
import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart';
410
import 'package:integration_test/integration_test.dart';
511

612
void main() {
713
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
814

9-
group('$SharedPreferences', () {
15+
group('SharedPreferencesMacOS', () {
1016
const Map<String, dynamic> kTestValues = <String, dynamic>{
1117
'flutter.String': 'hello world',
1218
'flutter.bool': true,
@@ -23,67 +29,81 @@ void main() {
2329
'flutter.List': <String>['baz', 'quox'],
2430
};
2531

26-
SharedPreferences preferences;
32+
SharedPreferencesStorePlatform preferences;
2733

2834
setUp(() async {
29-
preferences = await SharedPreferences.getInstance();
35+
preferences = SharedPreferencesStorePlatform.instance;
3036
});
3137

3238
tearDown(() {
3339
preferences.clear();
3440
});
3541

36-
test('reading', () 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);
42+
// Normally the app-facing package adds the prefix, but since this test
43+
// bypasses the app-facing package it needs to be manually added.
44+
String _prefixedKey(String key) {
45+
return 'flutter.$key';
46+
}
47+
48+
testWidgets('reading', (WidgetTester _) async {
49+
final Map<String, Object> values = await preferences.getAll();
50+
expect(values[_prefixedKey('String')], isNull);
51+
expect(values[_prefixedKey('bool')], isNull);
52+
expect(values[_prefixedKey('int')], isNull);
53+
expect(values[_prefixedKey('double')], isNull);
54+
expect(values[_prefixedKey('List')], isNull);
4755
});
4856

49-
test('writing', () async {
57+
testWidgets('writing', (WidgetTester _) async {
5058
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'])
59+
preferences.setValue(
60+
'String', _prefixedKey('String'), kTestValues2['flutter.String']),
61+
preferences.setValue(
62+
'Bool', _prefixedKey('bool'), kTestValues2['flutter.bool']),
63+
preferences.setValue(
64+
'Int', _prefixedKey('int'), kTestValues2['flutter.int']),
65+
preferences.setValue(
66+
'Double', _prefixedKey('double'), kTestValues2['flutter.double']),
67+
preferences.setValue(
68+
'StringList', _prefixedKey('List'), kTestValues2['flutter.List'])
5669
]);
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']);
70+
final Map<String, Object> values = await preferences.getAll();
71+
expect(values[_prefixedKey('String')], kTestValues2['flutter.String']);
72+
expect(values[_prefixedKey('bool')], kTestValues2['flutter.bool']);
73+
expect(values[_prefixedKey('int')], kTestValues2['flutter.int']);
74+
expect(values[_prefixedKey('double')], kTestValues2['flutter.double']);
75+
expect(values[_prefixedKey('List')], kTestValues2['flutter.List']);
6276
});
6377

64-
test('removing', () async {
65-
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']);
78+
testWidgets('removing', (WidgetTester _) async {
79+
final String key = _prefixedKey('testKey');
80+
await preferences.setValue('String', key, kTestValues['flutter.String']);
81+
await preferences.setValue('Bool', key, kTestValues['flutter.bool']);
82+
await preferences.setValue('Int', key, kTestValues['flutter.int']);
83+
await preferences.setValue('Double', key, kTestValues['flutter.double']);
84+
await preferences.setValue(
85+
'StringList', key, kTestValues['flutter.List']);
7186
await preferences.remove(key);
72-
expect(preferences.get('testKey'), isNull);
87+
final Map<String, Object> values = await preferences.getAll();
88+
expect(values[key], isNull);
7389
});
7490

75-
test('clearing', () 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']);
91+
testWidgets('clearing', (WidgetTester _) async {
92+
await preferences.setValue(
93+
'String', 'String', kTestValues['flutter.String']);
94+
await preferences.setValue('Bool', 'bool', kTestValues['flutter.bool']);
95+
await preferences.setValue('Int', 'int', kTestValues['flutter.int']);
96+
await preferences.setValue(
97+
'Double', 'double', kTestValues['flutter.double']);
98+
await preferences.setValue(
99+
'StringList', 'List', kTestValues['flutter.List']);
81100
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);
101+
final Map<String, Object> values = await preferences.getAll();
102+
expect(values['String'], null);
103+
expect(values['bool'], null);
104+
expect(values['int'], null);
105+
expect(values['double'], null);
106+
expect(values['List'], null);
87107
});
88108
});
89109
}

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

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import 'dart:async';
88

99
import 'package:flutter/material.dart';
10-
import 'package:shared_preferences/shared_preferences.dart';
10+
import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart';
1111

1212
void main() {
1313
runApp(MyApp());
@@ -24,22 +24,28 @@ class MyApp extends StatelessWidget {
2424
}
2525

2626
class SharedPreferencesDemo extends StatefulWidget {
27-
SharedPreferencesDemo({Key key}) : super(key: key);
27+
SharedPreferencesDemo({Key? key}) : super(key: key);
2828

2929
@override
3030
SharedPreferencesDemoState createState() => SharedPreferencesDemoState();
3131
}
3232

3333
class SharedPreferencesDemoState extends State<SharedPreferencesDemo> {
34-
Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
35-
Future<int> _counter;
34+
SharedPreferencesStorePlatform _prefs =
35+
SharedPreferencesStorePlatform.instance;
36+
late Future<int> _counter;
37+
38+
// Includes the prefix because this is using the platform interface directly,
39+
// but the prefix (which the native code assumes is present) is added by the
40+
// app-facing package.
41+
static const String _prefKey = 'flutter.counter';
3642

3743
Future<void> _incrementCounter() async {
38-
final SharedPreferences prefs = await _prefs;
39-
final int counter = (prefs.getInt('counter') ?? 0) + 1;
44+
final Map<String, Object> values = await _prefs.getAll();
45+
final int counter = ((values[_prefKey] as int?) ?? 0) + 1;
4046

4147
setState(() {
42-
_counter = prefs.setInt("counter", counter).then((bool success) {
48+
_counter = _prefs.setValue('Int', _prefKey, counter).then((bool success) {
4349
return counter;
4450
});
4551
});
@@ -48,8 +54,8 @@ class SharedPreferencesDemoState extends State<SharedPreferencesDemo> {
4854
@override
4955
void initState() {
5056
super.initState();
51-
_counter = _prefs.then((SharedPreferences prefs) {
52-
return (prefs.getInt('counter') ?? 0);
57+
_counter = _prefs.getAll().then((Map<String, Object> values) {
58+
return (values[_prefKey] as int?) ?? 0;
5359
});
5460
}
5561

packages/shared_preferences/shared_preferences_macos/example/macos/Runner.xcodeproj/project.pbxproj

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,6 @@
2626
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
2727
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
2828
33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
29-
33D1A10422148B71006C7A3E /* FlutterMacOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */; };
30-
33D1A10522148B93006C7A3E /* FlutterMacOS.framework in Bundle Framework */ = {isa = PBXBuildFile; fileRef = 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
31-
D73912F022F37F9E000D13A0 /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D73912EF22F37F9E000D13A0 /* App.framework */; };
32-
D73912F222F3801D000D13A0 /* App.framework in Bundle Framework */ = {isa = PBXBuildFile; fileRef = D73912EF22F37F9E000D13A0 /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
3329
DD4A1B9DEDBB72C87CD7AE27 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5067D74CB28D28AE3B3DD05B /* Pods_Runner.framework */; };
3430
/* End PBXBuildFile section */
3531

@@ -50,8 +46,6 @@
5046
dstPath = "";
5147
dstSubfolderSpec = 10;
5248
files = (
53-
D73912F222F3801D000D13A0 /* App.framework in Bundle Framework */,
54-
33D1A10522148B93006C7A3E /* FlutterMacOS.framework in Bundle Framework */,
5549
);
5650
name = "Bundle Framework";
5751
runOnlyForDeploymentPostprocessing = 0;
@@ -70,7 +64,6 @@
7064
33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = "<group>"; };
7165
33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = "<group>"; };
7266
33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = "<group>"; };
73-
33D1A10322148B71006C7A3E /* FlutterMacOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FlutterMacOS.framework; path = Flutter/ephemeral/FlutterMacOS.framework; sourceTree = SOURCE_ROOT; };
7467
33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; };
7568
33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
7669
33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
@@ -80,16 +73,13 @@
8073
899489AD6AA35AECA4E2BEA6 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
8174
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
8275
B36FDC1D769C9045B8821207 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
83-
D73912EF22F37F9E000D13A0 /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/ephemeral/App.framework; sourceTree = SOURCE_ROOT; };
8476
/* End PBXFileReference section */
8577

8678
/* Begin PBXFrameworksBuildPhase section */
8779
33CC10EA2044A3C60003C045 /* Frameworks */ = {
8880
isa = PBXFrameworksBuildPhase;
8981
buildActionMask = 2147483647;
9082
files = (
91-
D73912F022F37F9E000D13A0 /* App.framework in Frameworks */,
92-
33D1A10422148B71006C7A3E /* FlutterMacOS.framework in Frameworks */,
9383
DD4A1B9DEDBB72C87CD7AE27 /* Pods_Runner.framework in Frameworks */,
9484
);
9585
runOnlyForDeploymentPostprocessing = 0;
@@ -145,8 +135,6 @@
145135
33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
146136
33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,
147137
33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,
148-
D73912EF22F37F9E000D13A0 /* App.framework */,
149-
33D1A10322148B71006C7A3E /* FlutterMacOS.framework */,
150138
);
151139
path = Flutter;
152140
sourceTree = "<group>";
@@ -281,7 +269,7 @@
281269
);
282270
runOnlyForDeploymentPostprocessing = 0;
283271
shellPath = /bin/sh;
284-
shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename\n";
272+
shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n";
285273
};
286274
33CC111E2044C6BF0003C045 /* ShellScript */ = {
287275
isa = PBXShellScriptBuildPhase;
@@ -308,10 +296,13 @@
308296
buildActionMask = 2147483647;
309297
files = (
310298
);
311-
inputFileListPaths = (
299+
inputPaths = (
300+
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
301+
"${BUILT_PRODUCTS_DIR}/shared_preferences_macos/shared_preferences_macos.framework",
312302
);
313303
name = "[CP] Embed Pods Frameworks";
314-
outputFileListPaths = (
304+
outputPaths = (
305+
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences_macos.framework",
315306
);
316307
runOnlyForDeploymentPostprocessing = 0;
317308
shellPath = /bin/sh;

packages/shared_preferences/shared_preferences_macos/example/macos/Runner.xcworkspace/contents.xcworkspacedata

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)