Skip to content
This repository has been archived by the owner on Feb 22, 2023. It is now read-only.

[file_selector_web] Migrated to null-safety #3550

Merged
merged 22 commits into from
Feb 25, 2021
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/file_selector/file_selector_web/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# 1.0.0-nullsafety.0

- Migrated to null-safety

# 0.7.0+1

- Add dummy `ios` dir, so flutter sdk can be lower than 1.20
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// @dart = 2.9

import 'dart:html';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
Expand All @@ -13,18 +11,18 @@ import 'package:file_selector_platform_interface/file_selector_platform_interfac
void main() {
group('FileSelectorWeb', () {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
DomHelper domHelper;
FileUploadInputElement input;
late DomHelper domHelper;
FileUploadInputElement? input;

FileList FileListItems(List<File> files) {
FileList? FileListItems(List<File> files) {
final dataTransfer = DataTransfer();
files.forEach(dataTransfer.items.add);
return dataTransfer.files;
files.forEach(dataTransfer.items!.add);
return dataTransfer.files as FileList?;
}

void setFilesAndTriggerChange(List<File> files) {
input.files = FileListItems(files);
input.dispatchEvent(Event('change'));
input!.files = FileListItems(files);
input!.dispatchEvent(Event('change'));
}

setUp(() {
Expand Down Expand Up @@ -87,17 +85,17 @@ void main() {
bool wasClicked = false;

//ignore: unawaited_futures
input.onClick.first.then((_) => wasClicked = true);
input!.onClick.first.then((_) => wasClicked = true);

final futureFile = domHelper.getFiles(
accept: accept,
multiple: multiple,
input: input,
);

expect(input.matchesWithAncestors('body'), true);
expect(input.accept, accept);
expect(input.multiple, multiple);
expect(input!.matchesWithAncestors('body'), true);
expect(input!.accept, accept);
expect(input!.multiple, multiple);
expect(
wasClicked,
true,
Expand All @@ -109,7 +107,7 @@ void main() {
await futureFile;

// It should be already removed from the DOM after the file is resolved.
expect(input.parent, isNull);
expect(input!.parent, isNull);
});
});
});
Expand Down

This file was deleted.

34 changes: 17 additions & 17 deletions packages/file_selector/file_selector_web/lib/file_selector_web.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import 'package:file_selector_web/src/utils.dart';
///
/// This class implements the `package:file_selector` functionality for the web.
class FileSelectorWeb extends FileSelectorPlatform {
final _domHelper;
final DomHelper _domHelper;

/// Registers this class as the default instance of [FileSelectorPlatform].
static void registerWith(Registrar registrar) {
Expand All @@ -23,46 +23,46 @@ class FileSelectorWeb extends FileSelectorPlatform {
/// Default constructor, initializes _domHelper that we can use
/// to interact with the DOM.
/// overrides parameter allows for testing to override functions
FileSelectorWeb({@visibleForTesting DomHelper domHelper})
FileSelectorWeb({@visibleForTesting DomHelper? domHelper})
: _domHelper = domHelper ?? DomHelper();

@override
Future<XFile> openFile({
List<XTypeGroup> acceptedTypeGroups,
String initialDirectory,
String confirmButtonText,
List<XTypeGroup>? acceptedTypeGroups,
String? initialDirectory,
String? confirmButtonText,
}) async {
final files = await _openFiles(acceptedTypeGroups: acceptedTypeGroups);
return files.first;
}

@override
Future<List<XFile>> openFiles({
List<XTypeGroup> acceptedTypeGroups,
String initialDirectory,
String confirmButtonText,
List<XTypeGroup>? acceptedTypeGroups,
String? initialDirectory,
String? confirmButtonText,
}) async {
return _openFiles(acceptedTypeGroups: acceptedTypeGroups, multiple: true);
}

@override
Future<String> getSavePath({
List<XTypeGroup> acceptedTypeGroups,
String initialDirectory,
String suggestedName,
String confirmButtonText,
Future<String?> getSavePath({
List<XTypeGroup>? acceptedTypeGroups,
String? initialDirectory,
String? suggestedName,
String? confirmButtonText,
}) async =>
null;

@override
Future<String> getDirectoryPath({
String initialDirectory,
String confirmButtonText,
Future<String?> getDirectoryPath({
String? initialDirectory,
String? confirmButtonText,
}) async =>
null;

Future<List<XFile>> _openFiles({
List<XTypeGroup> acceptedTypeGroups,
List<XTypeGroup>? acceptedTypeGroups,
bool multiple = false,
}) async {
final accept = acceptedTypesToString(acceptedTypeGroups);
Expand Down
12 changes: 6 additions & 6 deletions packages/file_selector/file_selector_web/lib/src/dom_helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ class DomHelper {

/// Default constructor, initializes the container DOM element.
DomHelper() {
final body = querySelector('body');
final body = querySelector('body')!;
body.children.add(_container);
}

/// Sets the <input /> attributes and waits for a file to be selected.
Future<List<XFile>> getFiles({
String accept = '',
bool multiple = false,
@visibleForTesting FileUploadInputElement input,
@visibleForTesting FileUploadInputElement? input,
}) {
final Completer<List<XFile>> _completer = Completer();
input = input ?? FileUploadInputElement();
Expand All @@ -34,18 +34,18 @@ class DomHelper {
);

input.onChange.first.then((_) {
final List<XFile> files = input.files.map(_convertFileToXFile).toList();
final List<XFile> files = input!.files!.map(_convertFileToXFile).toList();
input.remove();
_completer.complete(files);
});

input.onError.first.then((event) {
final ErrorEvent error = event;
final ErrorEvent error = event as ErrorEvent;
final platformException = PlatformException(
code: error.type,
message: error.message,
);
input.remove();
input!.remove();
ditman marked this conversation as resolved.
Show resolved Hide resolved
_completer.completeError(platformException);
});

Expand All @@ -58,6 +58,6 @@ class DomHelper {
Url.createObjectUrl(file),
name: file.name,
length: file.size,
lastModified: DateTime.fromMillisecondsSinceEpoch(file.lastModified),
lastModified: DateTime.fromMillisecondsSinceEpoch(file.lastModified!),
ditman marked this conversation as resolved.
Show resolved Hide resolved
);
}
14 changes: 7 additions & 7 deletions packages/file_selector/file_selector_web/lib/src/utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,19 @@
import 'package:file_selector_platform_interface/file_selector_platform_interface.dart';

/// Convert list of XTypeGroups to a comma-separated string
String acceptedTypesToString(List<XTypeGroup> acceptedTypes) {
String acceptedTypesToString(List<XTypeGroup>? acceptedTypes) {
if (acceptedTypes == null) return '';
final List<String> allTypes = [];
for (final group in acceptedTypes) {
_assertTypeGroupIsValid(group);
if (group.extensions != null) {
allTypes.addAll(group.extensions.map(_normalizeExtension));
allTypes.addAll(group.extensions!.map(_normalizeExtension));
}
if (group.mimeTypes != null) {
allTypes.addAll(group.mimeTypes);
allTypes.addAll(group.mimeTypes!);
}
if (group.webWildCards != null) {
allTypes.addAll(group.webWildCards);
allTypes.addAll(group.webWildCards!);
}
}
return allTypes.join(',');
Expand All @@ -26,9 +26,9 @@ String acceptedTypesToString(List<XTypeGroup> acceptedTypes) {
/// Make sure that at least one of its fields is populated.
void _assertTypeGroupIsValid(XTypeGroup group) {
assert(
!((group.extensions == null || group.extensions.isEmpty) &&
(group.mimeTypes == null || group.mimeTypes.isEmpty) &&
(group.webWildCards == null || group.webWildCards.isEmpty)),
!((group.extensions == null || group.extensions!.isEmpty) &&
(group.mimeTypes == null || group.mimeTypes!.isEmpty) &&
(group.webWildCards == null || group.webWildCards!.isEmpty)),
'At least one of extensions / mimeTypes / webWildCards is required for web.');
}

Expand Down
18 changes: 9 additions & 9 deletions packages/file_selector/file_selector_web/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: file_selector_web
description: Web platform implementation of file_selector
homepage: https://github.com/flutter/plugins/tree/master/packages/file_selector/file_selector_web
version: 0.7.0+1
version: 1.0.0-nullsafety.0

flutter:
plugin:
Expand All @@ -11,22 +11,22 @@ flutter:
fileName: file_selector_web.dart

dependencies:
file_selector_platform_interface: ^1.0.2
platform_detect: ^1.4.0
file_selector_platform_interface: ^2.0.0-nullsafety.0
flutter:
sdk: flutter
flutter_web_plugins:
sdk: flutter
meta: ^1.1.7
meta: ^1.3.0-nullsafety.6
ditman marked this conversation as resolved.
Show resolved Hide resolved

dev_dependencies:
flutter_test:
sdk: flutter
mockito: ^4.1.1
pedantic: ^1.8.0
mockito: ^5.0.0-nullsafety.5
pedantic: ^1.10.0
integration_test:
path: ../../integration_test
sdk: flutter
build_runner: ^1.10.0

environment:
sdk: ">=2.2.0 <3.0.0"
flutter: ">=1.10.0"
sdk: '>=2.12.0-0 <3.0.0'
flutter: ">=1.26.0-0"
2 changes: 0 additions & 2 deletions packages/file_selector/file_selector_web/test/utils_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// @dart = 2.9

import 'package:flutter_test/flutter_test.dart';
import 'package:file_selector_web/src/utils.dart';
import 'package:file_selector_platform_interface/file_selector_platform_interface.dart';
Expand Down