Skip to content

Commit 7adfc2f

Browse files
authored
[file_selector_platform_interface] File selector nnbd (flutter#3509)
Migrating file_selector_interface to null-safety
1 parent 3d70464 commit 7adfc2f

File tree

8 files changed

+60
-53
lines changed

8 files changed

+60
-53
lines changed

packages/file_selector/file_selector_platform_interface/CHANGELOG.md

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

37
* Bump the [cross_file](https://pub.dev/packages/cross_file) package version.

packages/file_selector/file_selector_platform_interface/lib/src/method_channel/method_channel_file_selector.dart

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,57 +19,57 @@ class MethodChannelFileSelector extends FileSelectorPlatform {
1919

2020
/// Load a file from user's computer and return it as an XFile
2121
@override
22-
Future<XFile> openFile({
23-
List<XTypeGroup> acceptedTypeGroups,
24-
String initialDirectory,
25-
String confirmButtonText,
22+
Future<XFile?> openFile({
23+
List<XTypeGroup>? acceptedTypeGroups,
24+
String? initialDirectory,
25+
String? confirmButtonText,
2626
}) async {
27-
final List<String> path = await _channel.invokeListMethod<String>(
27+
final List<String>? path = await _channel.invokeListMethod<String>(
2828
'openFile',
2929
<String, dynamic>{
3030
'acceptedTypeGroups':
31-
acceptedTypeGroups?.map((group) => group.toJSON())?.toList(),
31+
acceptedTypeGroups?.map((group) => group.toJSON()).toList(),
3232
'initialDirectory': initialDirectory,
3333
'confirmButtonText': confirmButtonText,
3434
'multiple': false,
3535
},
3636
);
37-
return path == null ? null : XFile(path?.first);
37+
return path == null ? null : XFile(path.first);
3838
}
3939

4040
/// Load multiple files from user's computer and return it as an XFile
4141
@override
4242
Future<List<XFile>> openFiles({
43-
List<XTypeGroup> acceptedTypeGroups,
44-
String initialDirectory,
45-
String confirmButtonText,
43+
List<XTypeGroup>? acceptedTypeGroups,
44+
String? initialDirectory,
45+
String? confirmButtonText,
4646
}) async {
47-
final List<String> pathList = await _channel.invokeListMethod<String>(
47+
final List<String>? pathList = await _channel.invokeListMethod<String>(
4848
'openFile',
4949
<String, dynamic>{
5050
'acceptedTypeGroups':
51-
acceptedTypeGroups?.map((group) => group.toJSON())?.toList(),
51+
acceptedTypeGroups?.map((group) => group.toJSON()).toList(),
5252
'initialDirectory': initialDirectory,
5353
'confirmButtonText': confirmButtonText,
5454
'multiple': true,
5555
},
5656
);
57-
return pathList?.map((path) => XFile(path))?.toList() ?? [];
57+
return pathList?.map((path) => XFile(path)).toList() ?? [];
5858
}
5959

6060
/// Gets the path from a save dialog
6161
@override
62-
Future<String> getSavePath({
63-
List<XTypeGroup> acceptedTypeGroups,
64-
String initialDirectory,
65-
String suggestedName,
66-
String confirmButtonText,
62+
Future<String?> getSavePath({
63+
List<XTypeGroup>? acceptedTypeGroups,
64+
String? initialDirectory,
65+
String? suggestedName,
66+
String? confirmButtonText,
6767
}) async {
6868
return _channel.invokeMethod<String>(
6969
'getSavePath',
7070
<String, dynamic>{
7171
'acceptedTypeGroups':
72-
acceptedTypeGroups?.map((group) => group.toJSON())?.toList(),
72+
acceptedTypeGroups?.map((group) => group.toJSON()).toList(),
7373
'initialDirectory': initialDirectory,
7474
'suggestedName': suggestedName,
7575
'confirmButtonText': confirmButtonText,
@@ -79,9 +79,9 @@ class MethodChannelFileSelector extends FileSelectorPlatform {
7979

8080
/// Gets a directory path from a dialog
8181
@override
82-
Future<String> getDirectoryPath({
83-
String initialDirectory,
84-
String confirmButtonText,
82+
Future<String?> getDirectoryPath({
83+
String? initialDirectory,
84+
String? confirmButtonText,
8585
}) async {
8686
return _channel.invokeMethod<String>(
8787
'getDirectoryPath',

packages/file_selector/file_selector_platform_interface/lib/src/platform_interface/file_selector_interface.dart

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,37 +38,40 @@ abstract class FileSelectorPlatform extends PlatformInterface {
3838
}
3939

4040
/// Open file dialog for loading files and return a file path
41-
Future<XFile> openFile({
42-
List<XTypeGroup> acceptedTypeGroups,
43-
String initialDirectory,
44-
String confirmButtonText,
41+
/// Returns `null` if user cancels the operation.
42+
Future<XFile?> openFile({
43+
List<XTypeGroup>? acceptedTypeGroups,
44+
String? initialDirectory,
45+
String? confirmButtonText,
4546
}) {
4647
throw UnimplementedError('openFile() has not been implemented.');
4748
}
4849

4950
/// Open file dialog for loading files and return a list of file paths
5051
Future<List<XFile>> openFiles({
51-
List<XTypeGroup> acceptedTypeGroups,
52-
String initialDirectory,
53-
String confirmButtonText,
52+
List<XTypeGroup>? acceptedTypeGroups,
53+
String? initialDirectory,
54+
String? confirmButtonText,
5455
}) {
5556
throw UnimplementedError('openFiles() has not been implemented.');
5657
}
5758

5859
/// Open file dialog for saving files and return a file path at which to save
59-
Future<String> getSavePath({
60-
List<XTypeGroup> acceptedTypeGroups,
61-
String initialDirectory,
62-
String suggestedName,
63-
String confirmButtonText,
60+
/// Returns `null` if user cancels the operation.
61+
Future<String?> getSavePath({
62+
List<XTypeGroup>? acceptedTypeGroups,
63+
String? initialDirectory,
64+
String? suggestedName,
65+
String? confirmButtonText,
6466
}) {
6567
throw UnimplementedError('getSavePath() has not been implemented.');
6668
}
6769

6870
/// Open file dialog for loading directories and return a directory path
69-
Future<String> getDirectoryPath({
70-
String initialDirectory,
71-
String confirmButtonText,
71+
/// Returns `null` if user cancels the operation.
72+
Future<String?> getDirectoryPath({
73+
String? initialDirectory,
74+
String? confirmButtonText,
7275
}) {
7376
throw UnimplementedError('getDirectoryPath() has not been implemented.');
7477
}

packages/file_selector/file_selector_platform_interface/lib/src/types/x_type_group/x_type_group.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,19 @@ class XTypeGroup {
1717
});
1818

1919
/// The 'name' or reference to this group of types
20-
final String label;
20+
final String? label;
2121

2222
/// The extensions for this group
23-
final List<String> extensions;
23+
final List<String>? extensions;
2424

2525
/// The MIME types for this group
26-
final List<String> mimeTypes;
26+
final List<String>? mimeTypes;
2727

2828
/// The UTIs for this group
29-
final List<String> macUTIs;
29+
final List<String>? macUTIs;
3030

3131
/// The web wild cards for this group (ex: image/*, video/*)
32-
final List<String> webWildCards;
32+
final List<String>? webWildCards;
3333

3434
/// Converts this object into a JSON formatted object
3535
Map<String, dynamic> toJSON() {

packages/file_selector/file_selector_platform_interface/lib/src/web_helpers/web_helpers.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'dart:html';
22

33
/// Create anchor element with download attribute
4-
AnchorElement createAnchorElement(String href, String suggestedName) {
4+
AnchorElement createAnchorElement(String href, String? suggestedName) {
55
final element = AnchorElement(href: href);
66

77
if (suggestedName == null) {
@@ -27,7 +27,7 @@ Element ensureInitialized(String id) {
2727
if (target == null) {
2828
final Element targetElement = Element.tag('flt-x-file')..id = id;
2929

30-
querySelector('body').children.add(targetElement);
30+
querySelector('body')!.children.add(targetElement);
3131
target = targetElement;
3232
}
3333
return target;

packages/file_selector/file_selector_platform_interface/pubspec.yaml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,23 @@ description: A common platform interface for the file_selector plugin.
33
homepage: https://github.com/flutter/plugins/tree/master/packages/file_selector/file_selector_platform_interface
44
# NOTE: We strongly prefer non-breaking changes, even at the expense of a
55
# less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
6-
version: 1.0.3+1
6+
version: 2.0.0-nullsafety.0
77

88
dependencies:
99
flutter:
1010
sdk: flutter
1111
meta: ^1.0.5
12-
http: ^0.12.0+1
13-
plugin_platform_interface: ^1.0.1
14-
cross_file: ^0.2.0
12+
http: ^0.13.0-nullsafety.0
13+
plugin_platform_interface: ^1.1.0-nullsafety.2
14+
cross_file: ^0.3.0-nullsafety
1515

1616
dev_dependencies:
1717
test: ^1.15.0
1818
flutter_test:
1919
sdk: flutter
20-
mockito: ^4.1.1
20+
mockito: ^5.0.0-nullsafety.5
2121
pedantic: ^1.8.0
2222

2323
environment:
24-
sdk: ">=2.1.0 <3.0.0"
24+
sdk: '>=2.12.0-0 <3.0.0'
2525
flutter: ">=1.9.1+hotfix.4"

packages/file_selector/file_selector_web/pubspec.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ dependencies:
2222
dev_dependencies:
2323
flutter_test:
2424
sdk: flutter
25-
mockito: ^4.1.1
26-
pedantic: ^1.8.0
25+
mockito: ^5.0.0-nullsafety.5
26+
pedantic: ^1.10.0-nullsafety.3
2727
integration_test:
2828
path: ../../integration_test
2929

script/nnbd_plugins.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ readonly NNBD_PLUGINS_LIST=(
1010
"connectivity"
1111
"cross_file"
1212
"device_info"
13+
"file_selector"
1314
"flutter_plugin_android_lifecycle"
1415
"flutter_webview"
1516
"google_sign_in"
@@ -32,7 +33,6 @@ readonly NNBD_PLUGINS_LIST=(
3233
readonly NON_NNBD_PLUGINS_LIST=(
3334
# "android_alarm_manager"
3435
"camera"
35-
# "file_selector"
3636
# "google_maps_flutter"
3737
# "image_picker"
3838
# "in_app_purchase"

0 commit comments

Comments
 (0)