diff --git a/packages/file_selector/analysis_options.yaml b/packages/file_selector/analysis_options.yaml deleted file mode 100644 index cda4f6e153e6..000000000000 --- a/packages/file_selector/analysis_options.yaml +++ /dev/null @@ -1 +0,0 @@ -include: ../../analysis_options_legacy.yaml diff --git a/packages/file_selector/file_selector/CHANGELOG.md b/packages/file_selector/file_selector/CHANGELOG.md index 2f8a4d0754f1..225f601c3ee6 100644 --- a/packages/file_selector/file_selector/CHANGELOG.md +++ b/packages/file_selector/file_selector/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Minor code cleanup for new analysis rules. + ## 0.8.2 * Update platform_plugin_interface version requirement. diff --git a/packages/file_selector/file_selector/example/lib/get_directory_page.dart b/packages/file_selector/file_selector/example/lib/get_directory_page.dart index 6022559ce40e..b3ed9d0eeaca 100644 --- a/packages/file_selector/file_selector/example/lib/get_directory_page.dart +++ b/packages/file_selector/file_selector/example/lib/get_directory_page.dart @@ -7,8 +7,8 @@ import 'package:flutter/material.dart'; /// Screen that shows an example of getDirectoryPath class GetDirectoryPage extends StatelessWidget { - void _getDirectoryPath(BuildContext context) async { - final String confirmButtonText = 'Choose'; + Future _getDirectoryPath(BuildContext context) async { + const String confirmButtonText = 'Choose'; final String? directoryPath = await getDirectoryPath( confirmButtonText: confirmButtonText, ); @@ -16,9 +16,9 @@ class GetDirectoryPage extends StatelessWidget { // Operation was canceled by the user. return; } - await showDialog( + await showDialog( context: context, - builder: (context) => TextDisplay(directoryPath), + builder: (BuildContext context) => TextDisplay(directoryPath), ); } @@ -26,7 +26,7 @@ class GetDirectoryPage extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text("Open a text file"), + title: const Text('Open a text file'), ), body: Center( child: Column( @@ -37,7 +37,7 @@ class GetDirectoryPage extends StatelessWidget { primary: Colors.blue, onPrimary: Colors.white, ), - child: Text('Press to ask user to choose a directory'), + child: const Text('Press to ask user to choose a directory'), onPressed: () => _getDirectoryPath(context), ), ], @@ -49,22 +49,22 @@ class GetDirectoryPage extends StatelessWidget { /// Widget that displays a text file in a dialog class TextDisplay extends StatelessWidget { + /// Default Constructor + const TextDisplay(this.directoryPath); + /// Directory path final String directoryPath; - /// Default Constructor - TextDisplay(this.directoryPath); - @override Widget build(BuildContext context) { return AlertDialog( - title: Text('Selected Directory'), + title: const Text('Selected Directory'), content: Scrollbar( child: SingleChildScrollView( child: Text(directoryPath), ), ), - actions: [ + actions: [ TextButton( child: const Text('Close'), onPressed: () => Navigator.pop(context), diff --git a/packages/file_selector/file_selector/example/lib/home_page.dart b/packages/file_selector/file_selector/example/lib/home_page.dart index ab0b5c32187c..c598cbdf2611 100644 --- a/packages/file_selector/file_selector/example/lib/home_page.dart +++ b/packages/file_selector/file_selector/example/lib/home_page.dart @@ -14,7 +14,7 @@ class HomePage extends StatelessWidget { ); return Scaffold( appBar: AppBar( - title: Text('File Selector Demo Home Page'), + title: const Text('File Selector Demo Home Page'), ), body: Center( child: Column( @@ -22,31 +22,31 @@ class HomePage extends StatelessWidget { children: [ ElevatedButton( style: style, - child: Text('Open a text file'), + child: const Text('Open a text file'), onPressed: () => Navigator.pushNamed(context, '/open/text'), ), - SizedBox(height: 10), + const SizedBox(height: 10), ElevatedButton( style: style, - child: Text('Open an image'), + child: const Text('Open an image'), onPressed: () => Navigator.pushNamed(context, '/open/image'), ), - SizedBox(height: 10), + const SizedBox(height: 10), ElevatedButton( style: style, - child: Text('Open multiple images'), + child: const Text('Open multiple images'), onPressed: () => Navigator.pushNamed(context, '/open/images'), ), - SizedBox(height: 10), + const SizedBox(height: 10), ElevatedButton( style: style, - child: Text('Save a file'), + child: const Text('Save a file'), onPressed: () => Navigator.pushNamed(context, '/save/text'), ), - SizedBox(height: 10), + const SizedBox(height: 10), ElevatedButton( style: style, - child: Text('Open a get directory dialog'), + child: const Text('Open a get directory dialog'), onPressed: () => Navigator.pushNamed(context, '/directory'), ), ], diff --git a/packages/file_selector/file_selector/example/lib/main.dart b/packages/file_selector/file_selector/example/lib/main.dart index bd4c9b7ab853..14ce3f593f33 100644 --- a/packages/file_selector/file_selector/example/lib/main.dart +++ b/packages/file_selector/file_selector/example/lib/main.dart @@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:flutter/material.dart'; -import 'package:example/home_page.dart'; import 'package:example/get_directory_page.dart'; -import 'package:example/open_text_page.dart'; +import 'package:example/home_page.dart'; import 'package:example/open_image_page.dart'; import 'package:example/open_multiple_images_page.dart'; +import 'package:example/open_text_page.dart'; import 'package:example/save_text_page.dart'; +import 'package:flutter/material.dart'; void main() { runApp(MyApp()); @@ -25,12 +25,12 @@ class MyApp extends StatelessWidget { visualDensity: VisualDensity.adaptivePlatformDensity, ), home: HomePage(), - routes: { - '/open/image': (context) => OpenImagePage(), - '/open/images': (context) => OpenMultipleImagesPage(), - '/open/text': (context) => OpenTextPage(), - '/save/text': (context) => SaveTextPage(), - '/directory': (context) => GetDirectoryPage(), + routes: { + '/open/image': (BuildContext context) => OpenImagePage(), + '/open/images': (BuildContext context) => OpenMultipleImagesPage(), + '/open/text': (BuildContext context) => OpenTextPage(), + '/save/text': (BuildContext context) => SaveTextPage(), + '/directory': (BuildContext context) => GetDirectoryPage(), }, ); } diff --git a/packages/file_selector/file_selector/example/lib/open_image_page.dart b/packages/file_selector/file_selector/example/lib/open_image_page.dart index ae0d5ad4eefb..0abdba6eb72d 100644 --- a/packages/file_selector/file_selector/example/lib/open_image_page.dart +++ b/packages/file_selector/file_selector/example/lib/open_image_page.dart @@ -3,18 +3,20 @@ // found in the LICENSE file. import 'dart:io'; -import 'package:flutter/foundation.dart'; + import 'package:file_selector/file_selector.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; /// Screen that shows an example of openFiles class OpenImagePage extends StatelessWidget { - void _openImageFile(BuildContext context) async { + Future _openImageFile(BuildContext context) async { final XTypeGroup typeGroup = XTypeGroup( label: 'images', - extensions: ['jpg', 'png'], + extensions: ['jpg', 'png'], ); - final List files = await openFiles(acceptedTypeGroups: [typeGroup]); + final List files = + await openFiles(acceptedTypeGroups: [typeGroup]); if (files.isEmpty) { // Operation was canceled by the user. return; @@ -23,9 +25,9 @@ class OpenImagePage extends StatelessWidget { final String fileName = file.name; final String filePath = file.path; - await showDialog( + await showDialog( context: context, - builder: (context) => ImageDisplay(fileName, filePath), + builder: (BuildContext context) => ImageDisplay(fileName, filePath), ); } @@ -33,7 +35,7 @@ class OpenImagePage extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text("Open an image"), + title: const Text('Open an image'), ), body: Center( child: Column( @@ -44,7 +46,7 @@ class OpenImagePage extends StatelessWidget { primary: Colors.blue, onPrimary: Colors.white, ), - child: Text('Press to open an image file(png, jpg)'), + child: const Text('Press to open an image file(png, jpg)'), onPressed: () => _openImageFile(context), ), ], @@ -56,15 +58,15 @@ class OpenImagePage extends StatelessWidget { /// Widget that displays a text file in a dialog class ImageDisplay extends StatelessWidget { + /// Default Constructor + const ImageDisplay(this.fileName, this.filePath); + /// Image's name final String fileName; /// Image's path final String filePath; - /// Default Constructor - ImageDisplay(this.fileName, this.filePath); - @override Widget build(BuildContext context) { return AlertDialog( @@ -72,7 +74,7 @@ class ImageDisplay extends StatelessWidget { // On web the filePath is a blob url // while on other platforms it is a system path. content: kIsWeb ? Image.network(filePath) : Image.file(File(filePath)), - actions: [ + actions: [ TextButton( child: const Text('Close'), onPressed: () { diff --git a/packages/file_selector/file_selector/example/lib/open_multiple_images_page.dart b/packages/file_selector/file_selector/example/lib/open_multiple_images_page.dart index 5bf080eff450..9a1101214aaa 100644 --- a/packages/file_selector/file_selector/example/lib/open_multiple_images_page.dart +++ b/packages/file_selector/file_selector/example/lib/open_multiple_images_page.dart @@ -3,22 +3,23 @@ // found in the LICENSE file. import 'dart:io'; -import 'package:flutter/foundation.dart'; + import 'package:file_selector/file_selector.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; /// Screen that shows an example of openFiles class OpenMultipleImagesPage extends StatelessWidget { - void _openImageFile(BuildContext context) async { + Future _openImageFile(BuildContext context) async { final XTypeGroup jpgsTypeGroup = XTypeGroup( label: 'JPEGs', - extensions: ['jpg', 'jpeg'], + extensions: ['jpg', 'jpeg'], ); final XTypeGroup pngTypeGroup = XTypeGroup( label: 'PNGs', - extensions: ['png'], + extensions: ['png'], ); - final List files = await openFiles(acceptedTypeGroups: [ + final List files = await openFiles(acceptedTypeGroups: [ jpgsTypeGroup, pngTypeGroup, ]); @@ -26,9 +27,9 @@ class OpenMultipleImagesPage extends StatelessWidget { // Operation was canceled by the user. return; } - await showDialog( + await showDialog( context: context, - builder: (context) => MultipleImagesDisplay(files), + builder: (BuildContext context) => MultipleImagesDisplay(files), ); } @@ -36,7 +37,7 @@ class OpenMultipleImagesPage extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text("Open multiple images"), + title: const Text('Open multiple images'), ), body: Center( child: Column( @@ -47,7 +48,7 @@ class OpenMultipleImagesPage extends StatelessWidget { primary: Colors.blue, onPrimary: Colors.white, ), - child: Text('Press to open multiple images (png, jpg)'), + child: const Text('Press to open multiple images (png, jpg)'), onPressed: () => _openImageFile(context), ), ], @@ -59,23 +60,23 @@ class OpenMultipleImagesPage extends StatelessWidget { /// Widget that displays a text file in a dialog class MultipleImagesDisplay extends StatelessWidget { + /// Default Constructor + const MultipleImagesDisplay(this.files); + /// The files containing the images final List files; - /// Default Constructor - MultipleImagesDisplay(this.files); - @override Widget build(BuildContext context) { return AlertDialog( - title: Text('Gallery'), + title: const Text('Gallery'), // On web the filePath is a blob url // while on other platforms it is a system path. content: Center( child: Row( children: [ ...files.map( - (file) => Flexible( + (XFile file) => Flexible( child: kIsWeb ? Image.network(file.path) : Image.file(File(file.path))), @@ -83,7 +84,7 @@ class MultipleImagesDisplay extends StatelessWidget { ], ), ), - actions: [ + actions: [ TextButton( child: const Text('Close'), onPressed: () { diff --git a/packages/file_selector/file_selector/example/lib/open_text_page.dart b/packages/file_selector/file_selector/example/lib/open_text_page.dart index 8451378f7baa..652e8596cf81 100644 --- a/packages/file_selector/file_selector/example/lib/open_text_page.dart +++ b/packages/file_selector/file_selector/example/lib/open_text_page.dart @@ -7,12 +7,13 @@ import 'package:flutter/material.dart'; /// Screen that shows an example of openFile class OpenTextPage extends StatelessWidget { - void _openTextFile(BuildContext context) async { + Future _openTextFile(BuildContext context) async { final XTypeGroup typeGroup = XTypeGroup( label: 'text', - extensions: ['txt', 'json'], + extensions: ['txt', 'json'], ); - final XFile? file = await openFile(acceptedTypeGroups: [typeGroup]); + final XFile? file = + await openFile(acceptedTypeGroups: [typeGroup]); if (file == null) { // Operation was canceled by the user. return; @@ -20,9 +21,9 @@ class OpenTextPage extends StatelessWidget { final String fileName = file.name; final String fileContent = await file.readAsString(); - await showDialog( + await showDialog( context: context, - builder: (context) => TextDisplay(fileName, fileContent), + builder: (BuildContext context) => TextDisplay(fileName, fileContent), ); } @@ -30,7 +31,7 @@ class OpenTextPage extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text("Open a text file"), + title: const Text('Open a text file'), ), body: Center( child: Column( @@ -41,7 +42,7 @@ class OpenTextPage extends StatelessWidget { primary: Colors.blue, onPrimary: Colors.white, ), - child: Text('Press to open a text file (json, txt)'), + child: const Text('Press to open a text file (json, txt)'), onPressed: () => _openTextFile(context), ), ], @@ -53,15 +54,15 @@ class OpenTextPage extends StatelessWidget { /// Widget that displays a text file in a dialog class TextDisplay extends StatelessWidget { + /// Default Constructor + const TextDisplay(this.fileName, this.fileContent); + /// File's name final String fileName; /// File to display final String fileContent; - /// Default Constructor - TextDisplay(this.fileName, this.fileContent); - @override Widget build(BuildContext context) { return AlertDialog( @@ -71,7 +72,7 @@ class TextDisplay extends StatelessWidget { child: Text(fileContent), ), ), - actions: [ + actions: [ TextButton( child: const Text('Close'), onPressed: () => Navigator.pop(context), diff --git a/packages/file_selector/file_selector/example/lib/save_text_page.dart b/packages/file_selector/file_selector/example/lib/save_text_page.dart index 1610fc05164d..108ef89b0248 100644 --- a/packages/file_selector/file_selector/example/lib/save_text_page.dart +++ b/packages/file_selector/file_selector/example/lib/save_text_page.dart @@ -11,8 +11,8 @@ class SaveTextPage extends StatelessWidget { final TextEditingController _nameController = TextEditingController(); final TextEditingController _contentController = TextEditingController(); - void _saveFile() async { - String? path = await getSavePath(); + Future _saveFile() async { + final String? path = await getSavePath(); if (path == null) { // Operation was canceled by the user. return; @@ -20,7 +20,7 @@ class SaveTextPage extends StatelessWidget { final String text = _contentController.text; final String fileName = _nameController.text; final Uint8List fileData = Uint8List.fromList(text.codeUnits); - final String fileMimeType = 'text/plain'; + const String fileMimeType = 'text/plain'; final XFile textFile = XFile.fromData(fileData, mimeType: fileMimeType, name: fileName); await textFile.saveTo(path); @@ -30,7 +30,7 @@ class SaveTextPage extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text("Save text into a file"), + title: const Text('Save text into a file'), ), body: Center( child: Column( @@ -42,7 +42,7 @@ class SaveTextPage extends StatelessWidget { minLines: 1, maxLines: 12, controller: _nameController, - decoration: InputDecoration( + decoration: const InputDecoration( hintText: '(Optional) Suggest File Name', ), ), @@ -53,18 +53,18 @@ class SaveTextPage extends StatelessWidget { minLines: 1, maxLines: 12, controller: _contentController, - decoration: InputDecoration( + decoration: const InputDecoration( hintText: 'Enter File Contents', ), ), ), - SizedBox(height: 10), + const SizedBox(height: 10), ElevatedButton( style: ElevatedButton.styleFrom( primary: Colors.blue, onPrimary: Colors.white, ), - child: Text('Press to save a text file'), + child: const Text('Press to save a text file'), onPressed: () => _saveFile(), ), ], diff --git a/packages/file_selector/file_selector/example/pubspec.yaml b/packages/file_selector/file_selector/example/pubspec.yaml index 4987c836ad63..531f4790afd0 100644 --- a/packages/file_selector/file_selector/example/pubspec.yaml +++ b/packages/file_selector/file_selector/example/pubspec.yaml @@ -8,9 +8,6 @@ environment: sdk: ">=2.12.0 <3.0.0" dependencies: - flutter: - sdk: flutter - file_selector: # When depending on this package from a real application you should use: # file_selector: ^x.y.z @@ -18,6 +15,8 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ + flutter: + sdk: flutter dev_dependencies: flutter_test: diff --git a/packages/file_selector/file_selector/test/file_selector_test.dart b/packages/file_selector/file_selector/test/file_selector_test.dart index 6d5e215eeb01..6ab0bd975036 100644 --- a/packages/file_selector/file_selector/test/file_selector_test.dart +++ b/packages/file_selector/file_selector/test/file_selector_test.dart @@ -2,23 +2,23 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:flutter_test/flutter_test.dart'; -import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'package:file_selector/file_selector.dart'; import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'package:test/fake.dart'; void main() { late FakeFileSelector fakePlatformImplementation; - final initialDirectory = '/home/flutteruser'; - final confirmButtonText = 'Use this profile picture'; - final suggestedName = 'suggested_name'; - final acceptedTypeGroups = [ - XTypeGroup(label: 'documents', mimeTypes: [ + const String initialDirectory = '/home/flutteruser'; + const String confirmButtonText = 'Use this profile picture'; + const String suggestedName = 'suggested_name'; + final List acceptedTypeGroups = [ + XTypeGroup(label: 'documents', mimeTypes: [ 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessing', ]), - XTypeGroup(label: 'images', extensions: [ + XTypeGroup(label: 'images', extensions: [ 'jpg', 'png', ]), @@ -30,7 +30,7 @@ void main() { }); group('openFile', () { - final expectedFile = XFile('path'); + final XFile expectedFile = XFile('path'); test('works', () async { fakePlatformImplementation @@ -40,7 +40,7 @@ void main() { acceptedTypeGroups: acceptedTypeGroups) ..setFileResponse([expectedFile]); - final file = await openFile( + final XFile? file = await openFile( initialDirectory: initialDirectory, confirmButtonText: confirmButtonText, acceptedTypeGroups: acceptedTypeGroups, @@ -52,7 +52,7 @@ void main() { test('works with no arguments', () async { fakePlatformImplementation.setFileResponse([expectedFile]); - final file = await openFile(); + final XFile? file = await openFile(); expect(file, expectedFile); }); @@ -62,7 +62,7 @@ void main() { ..setExpectations(initialDirectory: initialDirectory) ..setFileResponse([expectedFile]); - final file = await openFile(initialDirectory: initialDirectory); + final XFile? file = await openFile(initialDirectory: initialDirectory); expect(file, expectedFile); }); @@ -71,7 +71,7 @@ void main() { ..setExpectations(confirmButtonText: confirmButtonText) ..setFileResponse([expectedFile]); - final file = await openFile(confirmButtonText: confirmButtonText); + final XFile? file = await openFile(confirmButtonText: confirmButtonText); expect(file, expectedFile); }); @@ -80,13 +80,14 @@ void main() { ..setExpectations(acceptedTypeGroups: acceptedTypeGroups) ..setFileResponse([expectedFile]); - final file = await openFile(acceptedTypeGroups: acceptedTypeGroups); + final XFile? file = + await openFile(acceptedTypeGroups: acceptedTypeGroups); expect(file, expectedFile); }); }); group('openFiles', () { - final expectedFiles = [XFile('path')]; + final List expectedFiles = [XFile('path')]; test('works', () async { fakePlatformImplementation @@ -96,19 +97,19 @@ void main() { acceptedTypeGroups: acceptedTypeGroups) ..setFileResponse(expectedFiles); - final file = await openFiles( + final List files = await openFiles( initialDirectory: initialDirectory, confirmButtonText: confirmButtonText, acceptedTypeGroups: acceptedTypeGroups, ); - expect(file, expectedFiles); + expect(files, expectedFiles); }); test('works with no arguments', () async { fakePlatformImplementation.setFileResponse(expectedFiles); - final files = await openFiles(); + final List files = await openFiles(); expect(files, expectedFiles); }); @@ -118,7 +119,8 @@ void main() { ..setExpectations(initialDirectory: initialDirectory) ..setFileResponse(expectedFiles); - final files = await openFiles(initialDirectory: initialDirectory); + final List files = + await openFiles(initialDirectory: initialDirectory); expect(files, expectedFiles); }); @@ -127,7 +129,8 @@ void main() { ..setExpectations(confirmButtonText: confirmButtonText) ..setFileResponse(expectedFiles); - final files = await openFiles(confirmButtonText: confirmButtonText); + final List files = + await openFiles(confirmButtonText: confirmButtonText); expect(files, expectedFiles); }); @@ -136,13 +139,14 @@ void main() { ..setExpectations(acceptedTypeGroups: acceptedTypeGroups) ..setFileResponse(expectedFiles); - final files = await openFiles(acceptedTypeGroups: acceptedTypeGroups); + final List files = + await openFiles(acceptedTypeGroups: acceptedTypeGroups); expect(files, expectedFiles); }); }); group('getSavePath', () { - final expectedSavePath = '/example/path'; + const String expectedSavePath = '/example/path'; test('works', () async { fakePlatformImplementation @@ -153,7 +157,7 @@ void main() { suggestedName: suggestedName) ..setPathResponse(expectedSavePath); - final savePath = await getSavePath( + final String? savePath = await getSavePath( initialDirectory: initialDirectory, confirmButtonText: confirmButtonText, acceptedTypeGroups: acceptedTypeGroups, @@ -166,7 +170,7 @@ void main() { test('works with no arguments', () async { fakePlatformImplementation.setPathResponse(expectedSavePath); - final savePath = await getSavePath(); + final String? savePath = await getSavePath(); expect(savePath, expectedSavePath); }); @@ -175,7 +179,8 @@ void main() { ..setExpectations(initialDirectory: initialDirectory) ..setPathResponse(expectedSavePath); - final savePath = await getSavePath(initialDirectory: initialDirectory); + final String? savePath = + await getSavePath(initialDirectory: initialDirectory); expect(savePath, expectedSavePath); }); @@ -184,7 +189,8 @@ void main() { ..setExpectations(confirmButtonText: confirmButtonText) ..setPathResponse(expectedSavePath); - final savePath = await getSavePath(confirmButtonText: confirmButtonText); + final String? savePath = + await getSavePath(confirmButtonText: confirmButtonText); expect(savePath, expectedSavePath); }); @@ -193,7 +199,7 @@ void main() { ..setExpectations(acceptedTypeGroups: acceptedTypeGroups) ..setPathResponse(expectedSavePath); - final savePath = + final String? savePath = await getSavePath(acceptedTypeGroups: acceptedTypeGroups); expect(savePath, expectedSavePath); }); @@ -203,13 +209,13 @@ void main() { ..setExpectations(suggestedName: suggestedName) ..setPathResponse(expectedSavePath); - final savePath = await getSavePath(suggestedName: suggestedName); + final String? savePath = await getSavePath(suggestedName: suggestedName); expect(savePath, expectedSavePath); }); }); group('getDirectoryPath', () { - final expectedDirectoryPath = '/example/path'; + const String expectedDirectoryPath = '/example/path'; test('works', () async { fakePlatformImplementation @@ -218,7 +224,7 @@ void main() { confirmButtonText: confirmButtonText) ..setPathResponse(expectedDirectoryPath); - final directoryPath = await getDirectoryPath( + final String? directoryPath = await getDirectoryPath( initialDirectory: initialDirectory, confirmButtonText: confirmButtonText, ); @@ -229,7 +235,7 @@ void main() { test('works with no arguments', () async { fakePlatformImplementation.setPathResponse(expectedDirectoryPath); - final directoryPath = await getDirectoryPath(); + final String? directoryPath = await getDirectoryPath(); expect(directoryPath, expectedDirectoryPath); }); @@ -238,7 +244,7 @@ void main() { ..setExpectations(initialDirectory: initialDirectory) ..setPathResponse(expectedDirectoryPath); - final directoryPath = + final String? directoryPath = await getDirectoryPath(initialDirectory: initialDirectory); expect(directoryPath, expectedDirectoryPath); }); @@ -248,7 +254,7 @@ void main() { ..setExpectations(confirmButtonText: confirmButtonText) ..setPathResponse(expectedDirectoryPath); - final directoryPath = + final String? directoryPath = await getDirectoryPath(confirmButtonText: confirmButtonText); expect(directoryPath, expectedDirectoryPath); }); @@ -295,7 +301,7 @@ class FakeFileSelector extends Fake }) async { expect(acceptedTypeGroups, this.acceptedTypeGroups); expect(initialDirectory, this.initialDirectory); - expect(suggestedName, this.suggestedName); + expect(suggestedName, suggestedName); return files?[0]; } @@ -307,7 +313,7 @@ class FakeFileSelector extends Fake }) async { expect(acceptedTypeGroups, this.acceptedTypeGroups); expect(initialDirectory, this.initialDirectory); - expect(suggestedName, this.suggestedName); + expect(suggestedName, suggestedName); return files!; } diff --git a/packages/file_selector/file_selector_platform_interface/CHANGELOG.md b/packages/file_selector/file_selector_platform_interface/CHANGELOG.md index ba595addfcaf..95701504fed5 100644 --- a/packages/file_selector/file_selector_platform_interface/CHANGELOG.md +++ b/packages/file_selector/file_selector_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Minor code cleanup for new analysis rules. + ## 2.0.2 * Update platform_plugin_interface version requirement. diff --git a/packages/file_selector/file_selector_platform_interface/lib/src/method_channel/method_channel_file_selector.dart b/packages/file_selector/file_selector_platform_interface/lib/src/method_channel/method_channel_file_selector.dart index 34017acc90e0..28ec41db6dde 100644 --- a/packages/file_selector/file_selector_platform_interface/lib/src/method_channel/method_channel_file_selector.dart +++ b/packages/file_selector/file_selector_platform_interface/lib/src/method_channel/method_channel_file_selector.dart @@ -3,9 +3,8 @@ // found in the LICENSE file. import 'package:cross_file/cross_file.dart'; -import 'package:flutter/services.dart'; - import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; +import 'package:flutter/services.dart'; import 'package:meta/meta.dart'; const MethodChannel _channel = @@ -27,8 +26,9 @@ class MethodChannelFileSelector extends FileSelectorPlatform { final List? path = await _channel.invokeListMethod( 'openFile', { - 'acceptedTypeGroups': - acceptedTypeGroups?.map((group) => group.toJSON()).toList(), + 'acceptedTypeGroups': acceptedTypeGroups + ?.map((XTypeGroup group) => group.toJSON()) + .toList(), 'initialDirectory': initialDirectory, 'confirmButtonText': confirmButtonText, 'multiple': false, @@ -47,14 +47,15 @@ class MethodChannelFileSelector extends FileSelectorPlatform { final List? pathList = await _channel.invokeListMethod( 'openFile', { - 'acceptedTypeGroups': - acceptedTypeGroups?.map((group) => group.toJSON()).toList(), + 'acceptedTypeGroups': acceptedTypeGroups + ?.map((XTypeGroup group) => group.toJSON()) + .toList(), 'initialDirectory': initialDirectory, 'confirmButtonText': confirmButtonText, 'multiple': true, }, ); - return pathList?.map((path) => XFile(path)).toList() ?? []; + return pathList?.map((String path) => XFile(path)).toList() ?? []; } /// Gets the path from a save dialog @@ -68,8 +69,9 @@ class MethodChannelFileSelector extends FileSelectorPlatform { return _channel.invokeMethod( 'getSavePath', { - 'acceptedTypeGroups': - acceptedTypeGroups?.map((group) => group.toJSON()).toList(), + 'acceptedTypeGroups': acceptedTypeGroups + ?.map((XTypeGroup group) => group.toJSON()) + .toList(), 'initialDirectory': initialDirectory, 'suggestedName': suggestedName, 'confirmButtonText': confirmButtonText, diff --git a/packages/file_selector/file_selector_platform_interface/lib/src/types/x_type_group/x_type_group.dart b/packages/file_selector/file_selector_platform_interface/lib/src/types/x_type_group/x_type_group.dart index 3e3326379610..2146131023e1 100644 --- a/packages/file_selector/file_selector_platform_interface/lib/src/types/x_type_group/x_type_group.dart +++ b/packages/file_selector/file_selector_platform_interface/lib/src/types/x_type_group/x_type_group.dart @@ -14,7 +14,7 @@ class XTypeGroup { this.mimeTypes, this.macUTIs, this.webWildCards, - }) : this.extensions = _removeLeadingDots(extensions); + }) : extensions = _removeLeadingDots(extensions); /// The 'name' or reference to this group of types final String? label; @@ -42,6 +42,7 @@ class XTypeGroup { }; } - static List? _removeLeadingDots(List? exts) => - exts?.map((ext) => ext.startsWith('.') ? ext.substring(1) : ext).toList(); + static List? _removeLeadingDots(List? exts) => exts + ?.map((String ext) => ext.startsWith('.') ? ext.substring(1) : ext) + .toList(); } diff --git a/packages/file_selector/file_selector_platform_interface/lib/src/web_helpers/web_helpers.dart b/packages/file_selector/file_selector_platform_interface/lib/src/web_helpers/web_helpers.dart index 0f157ed0be5a..bc7136f80bd6 100644 --- a/packages/file_selector/file_selector_platform_interface/lib/src/web_helpers/web_helpers.dart +++ b/packages/file_selector/file_selector_platform_interface/lib/src/web_helpers/web_helpers.dart @@ -6,7 +6,7 @@ import 'dart:html'; /// Create anchor element with download attribute AnchorElement createAnchorElement(String href, String? suggestedName) { - final element = AnchorElement(href: href); + final AnchorElement element = AnchorElement(href: href); if (suggestedName == null) { element.download = 'download'; @@ -27,7 +27,7 @@ void addElementToContainerAndClick(Element container, Element element) { /// Initializes a DOM container where we can host elements. Element ensureInitialized(String id) { - var target = querySelector('#${id}'); + Element? target = querySelector('#$id'); if (target == null) { final Element targetElement = Element.tag('flt-x-file')..id = id; diff --git a/packages/file_selector/file_selector_platform_interface/test/file_selector_platform_interface_test.dart b/packages/file_selector/file_selector_platform_interface/test/file_selector_platform_interface_test.dart index f5b609c93ed3..a5b22b977d69 100644 --- a/packages/file_selector/file_selector_platform_interface/test/file_selector_platform_interface_test.dart +++ b/packages/file_selector/file_selector_platform_interface/test/file_selector_platform_interface_test.dart @@ -2,10 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:flutter_test/flutter_test.dart'; - import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; import 'package:file_selector_platform_interface/src/method_channel/method_channel_file_selector.dart'; +import 'package:flutter_test/flutter_test.dart'; void main() { group('$FileSelectorPlatform', () { diff --git a/packages/file_selector/file_selector_platform_interface/test/method_channel_file_selector_test.dart b/packages/file_selector/file_selector_platform_interface/test/method_channel_file_selector_test.dart index 96a3c2d4f4c9..33f9fbf45a8b 100644 --- a/packages/file_selector/file_selector_platform_interface/test/method_channel_file_selector_test.dart +++ b/packages/file_selector/file_selector_platform_interface/test/method_channel_file_selector_test.dart @@ -2,17 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; - import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; import 'package:file_selector_platform_interface/src/method_channel/method_channel_file_selector.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); group('$MethodChannelFileSelector()', () { - MethodChannelFileSelector plugin = MethodChannelFileSelector(); + final MethodChannelFileSelector plugin = MethodChannelFileSelector(); final List log = []; @@ -27,27 +26,31 @@ void main() { group('#openFile', () { test('passes the accepted type groups correctly', () async { - final group = XTypeGroup( + final XTypeGroup group = XTypeGroup( label: 'text', - extensions: ['txt'], - mimeTypes: ['text/plain'], - macUTIs: ['public.text'], + extensions: ['txt'], + mimeTypes: ['text/plain'], + macUTIs: ['public.text'], ); - final groupTwo = XTypeGroup( + final XTypeGroup groupTwo = XTypeGroup( label: 'image', - extensions: ['jpg'], - mimeTypes: ['image/jpg'], - macUTIs: ['public.image'], - webWildCards: ['image/*']); + extensions: ['jpg'], + mimeTypes: ['image/jpg'], + macUTIs: ['public.image'], + webWildCards: ['image/*']); - await plugin.openFile(acceptedTypeGroups: [group, groupTwo]); + await plugin + .openFile(acceptedTypeGroups: [group, groupTwo]); expect( log, [ isMethodCall('openFile', arguments: { - 'acceptedTypeGroups': [group.toJSON(), groupTwo.toJSON()], + 'acceptedTypeGroups': >[ + group.toJSON(), + groupTwo.toJSON() + ], 'initialDirectory': null, 'confirmButtonText': null, 'multiple': false, @@ -56,14 +59,14 @@ void main() { ); }); test('passes initialDirectory correctly', () async { - await plugin.openFile(initialDirectory: "/example/directory"); + await plugin.openFile(initialDirectory: '/example/directory'); expect( log, [ isMethodCall('openFile', arguments: { 'acceptedTypeGroups': null, - 'initialDirectory': "/example/directory", + 'initialDirectory': '/example/directory', 'confirmButtonText': null, 'multiple': false, }), @@ -71,7 +74,7 @@ void main() { ); }); test('passes confirmButtonText correctly', () async { - await plugin.openFile(confirmButtonText: "Open File"); + await plugin.openFile(confirmButtonText: 'Open File'); expect( log, @@ -79,7 +82,7 @@ void main() { isMethodCall('openFile', arguments: { 'acceptedTypeGroups': null, 'initialDirectory': null, - 'confirmButtonText': "Open File", + 'confirmButtonText': 'Open File', 'multiple': false, }), ], @@ -88,27 +91,31 @@ void main() { }); group('#openFiles', () { test('passes the accepted type groups correctly', () async { - final group = XTypeGroup( + final XTypeGroup group = XTypeGroup( label: 'text', - extensions: ['txt'], - mimeTypes: ['text/plain'], - macUTIs: ['public.text'], + extensions: ['txt'], + mimeTypes: ['text/plain'], + macUTIs: ['public.text'], ); - final groupTwo = XTypeGroup( + final XTypeGroup groupTwo = XTypeGroup( label: 'image', - extensions: ['jpg'], - mimeTypes: ['image/jpg'], - macUTIs: ['public.image'], - webWildCards: ['image/*']); + extensions: ['jpg'], + mimeTypes: ['image/jpg'], + macUTIs: ['public.image'], + webWildCards: ['image/*']); - await plugin.openFiles(acceptedTypeGroups: [group, groupTwo]); + await plugin + .openFiles(acceptedTypeGroups: [group, groupTwo]); expect( log, [ isMethodCall('openFile', arguments: { - 'acceptedTypeGroups': [group.toJSON(), groupTwo.toJSON()], + 'acceptedTypeGroups': >[ + group.toJSON(), + groupTwo.toJSON() + ], 'initialDirectory': null, 'confirmButtonText': null, 'multiple': true, @@ -117,14 +124,14 @@ void main() { ); }); test('passes initialDirectory correctly', () async { - await plugin.openFiles(initialDirectory: "/example/directory"); + await plugin.openFiles(initialDirectory: '/example/directory'); expect( log, [ isMethodCall('openFile', arguments: { 'acceptedTypeGroups': null, - 'initialDirectory': "/example/directory", + 'initialDirectory': '/example/directory', 'confirmButtonText': null, 'multiple': true, }), @@ -132,7 +139,7 @@ void main() { ); }); test('passes confirmButtonText correctly', () async { - await plugin.openFiles(confirmButtonText: "Open File"); + await plugin.openFiles(confirmButtonText: 'Open File'); expect( log, @@ -140,7 +147,7 @@ void main() { isMethodCall('openFile', arguments: { 'acceptedTypeGroups': null, 'initialDirectory': null, - 'confirmButtonText': "Open File", + 'confirmButtonText': 'Open File', 'multiple': true, }), ], @@ -150,27 +157,31 @@ void main() { group('#getSavePath', () { test('passes the accepted type groups correctly', () async { - final group = XTypeGroup( + final XTypeGroup group = XTypeGroup( label: 'text', - extensions: ['txt'], - mimeTypes: ['text/plain'], - macUTIs: ['public.text'], + extensions: ['txt'], + mimeTypes: ['text/plain'], + macUTIs: ['public.text'], ); - final groupTwo = XTypeGroup( + final XTypeGroup groupTwo = XTypeGroup( label: 'image', - extensions: ['jpg'], - mimeTypes: ['image/jpg'], - macUTIs: ['public.image'], - webWildCards: ['image/*']); + extensions: ['jpg'], + mimeTypes: ['image/jpg'], + macUTIs: ['public.image'], + webWildCards: ['image/*']); - await plugin.getSavePath(acceptedTypeGroups: [group, groupTwo]); + await plugin + .getSavePath(acceptedTypeGroups: [group, groupTwo]); expect( log, [ isMethodCall('getSavePath', arguments: { - 'acceptedTypeGroups': [group.toJSON(), groupTwo.toJSON()], + 'acceptedTypeGroups': >[ + group.toJSON(), + groupTwo.toJSON() + ], 'initialDirectory': null, 'suggestedName': null, 'confirmButtonText': null, @@ -179,14 +190,14 @@ void main() { ); }); test('passes initialDirectory correctly', () async { - await plugin.getSavePath(initialDirectory: "/example/directory"); + await plugin.getSavePath(initialDirectory: '/example/directory'); expect( log, [ isMethodCall('getSavePath', arguments: { 'acceptedTypeGroups': null, - 'initialDirectory': "/example/directory", + 'initialDirectory': '/example/directory', 'suggestedName': null, 'confirmButtonText': null, }), @@ -194,7 +205,7 @@ void main() { ); }); test('passes confirmButtonText correctly', () async { - await plugin.getSavePath(confirmButtonText: "Open File"); + await plugin.getSavePath(confirmButtonText: 'Open File'); expect( log, @@ -203,34 +214,34 @@ void main() { 'acceptedTypeGroups': null, 'initialDirectory': null, 'suggestedName': null, - 'confirmButtonText': "Open File", + 'confirmButtonText': 'Open File', }), ], ); }); group('#getDirectoryPath', () { test('passes initialDirectory correctly', () async { - await plugin.getDirectoryPath(initialDirectory: "/example/directory"); + await plugin.getDirectoryPath(initialDirectory: '/example/directory'); expect( log, [ isMethodCall('getDirectoryPath', arguments: { - 'initialDirectory': "/example/directory", + 'initialDirectory': '/example/directory', 'confirmButtonText': null, }), ], ); }); test('passes confirmButtonText correctly', () async { - await plugin.getDirectoryPath(confirmButtonText: "Open File"); + await plugin.getDirectoryPath(confirmButtonText: 'Open File'); expect( log, [ isMethodCall('getDirectoryPath', arguments: { 'initialDirectory': null, - 'confirmButtonText': "Open File", + 'confirmButtonText': 'Open File', }), ], ); diff --git a/packages/file_selector/file_selector_platform_interface/test/x_type_group_test.dart b/packages/file_selector/file_selector_platform_interface/test/x_type_group_test.dart index e85a4929e411..84f5ca1f0bd2 100644 --- a/packages/file_selector/file_selector_platform_interface/test/x_type_group_test.dart +++ b/packages/file_selector/file_selector_platform_interface/test/x_type_group_test.dart @@ -2,19 +2,19 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:flutter_test/flutter_test.dart'; import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; +import 'package:flutter_test/flutter_test.dart'; void main() { group('XTypeGroup', () { test('toJSON() creates correct map', () { - final label = 'test group'; - final extensions = ['txt', 'jpg']; - final mimeTypes = ['text/plain']; - final macUTIs = ['public.plain-text']; - final webWildCards = ['image/*']; + const String label = 'test group'; + final List extensions = ['txt', 'jpg']; + final List mimeTypes = ['text/plain']; + final List macUTIs = ['public.plain-text']; + final List webWildCards = ['image/*']; - final group = XTypeGroup( + final XTypeGroup group = XTypeGroup( label: label, extensions: extensions, mimeTypes: mimeTypes, @@ -22,7 +22,7 @@ void main() { webWildCards: webWildCards, ); - final jsonMap = group.toJSON(); + final Map jsonMap = group.toJSON(); expect(jsonMap['label'], label); expect(jsonMap['extensions'], extensions); expect(jsonMap['mimeTypes'], mimeTypes); @@ -31,11 +31,11 @@ void main() { }); test('A wildcard group can be created', () { - final group = XTypeGroup( + final XTypeGroup group = XTypeGroup( label: 'Any', ); - final jsonMap = group.toJSON(); + final Map jsonMap = group.toJSON(); expect(jsonMap['extensions'], null); expect(jsonMap['mimeTypes'], null); expect(jsonMap['macUTIs'], null); @@ -43,10 +43,10 @@ void main() { }); test('Leading dots are removed from extensions', () { - final extensions = ['.txt', '.jpg']; - final group = XTypeGroup(extensions: extensions); + final List extensions = ['.txt', '.jpg']; + final XTypeGroup group = XTypeGroup(extensions: extensions); - expect(group.extensions, ['txt', 'jpg']); + expect(group.extensions, ['txt', 'jpg']); }); }); } diff --git a/packages/file_selector/file_selector_web/CHANGELOG.md b/packages/file_selector/file_selector_web/CHANGELOG.md index e2a863643027..dabd7173868c 100644 --- a/packages/file_selector/file_selector_web/CHANGELOG.md +++ b/packages/file_selector/file_selector_web/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Minor code cleanup for new analysis rules. + ## 0.8.1+2 * Add `implements` to pubspec. diff --git a/packages/file_selector/file_selector_web/example/integration_test/dom_helper_test.dart b/packages/file_selector/file_selector_web/example/integration_test/dom_helper_test.dart index f000574861ab..ee1af8cb62fd 100644 --- a/packages/file_selector/file_selector_web/example/integration_test/dom_helper_test.dart +++ b/packages/file_selector/file_selector_web/example/integration_test/dom_helper_test.dart @@ -3,10 +3,11 @@ // found in the LICENSE file. import 'dart:html'; + +import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; +import 'package:file_selector_web/src/dom_helper.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; -import 'package:file_selector_web/src/dom_helper.dart'; -import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; void main() { group('dom_helper', () { @@ -15,7 +16,7 @@ void main() { late FileUploadInputElement input; FileList? createFileList(List files) { - final dataTransfer = DataTransfer(); + final DataTransfer dataTransfer = DataTransfer(); files.forEach(dataTransfer.items!.add); return dataTransfer.files as FileList?; } @@ -31,15 +32,15 @@ void main() { }); group('getFiles', () { - final mockFile1 = File(['123456'], 'file1.txt'); - final mockFile2 = File([], 'file2.txt'); + final File mockFile1 = File(['123456'], 'file1.txt'); + final File mockFile2 = File([], 'file2.txt'); testWidgets('works', (_) async { final Future> futureFiles = domHelper.getFiles( input: input, ); - setFilesAndTriggerChange([mockFile1, mockFile2]); + setFilesAndTriggerChange([mockFile1, mockFile2]); final List files = await futureFiles; @@ -62,7 +63,7 @@ void main() { // It should work the first time futureFiles = domHelper.getFiles(input: input); - setFilesAndTriggerChange([mockFile1]); + setFilesAndTriggerChange([mockFile1]); files = await futureFiles; @@ -71,7 +72,7 @@ void main() { // The same input should work more than once futureFiles = domHelper.getFiles(input: input); - setFilesAndTriggerChange([mockFile2]); + setFilesAndTriggerChange([mockFile2]); files = await futureFiles; @@ -80,14 +81,14 @@ void main() { }); testWidgets('sets the attributes and clicks it', (_) async { - final accept = '.jpg,.png'; - final multiple = true; + const String accept = '.jpg,.png'; + const bool multiple = true; bool wasClicked = false; //ignore: unawaited_futures input.onClick.first.then((_) => wasClicked = true); - final futureFile = domHelper.getFiles( + final Future> futureFile = domHelper.getFiles( accept: accept, multiple: multiple, input: input, @@ -103,7 +104,7 @@ void main() { 'The should be clicked otherwise no dialog will be shown', ); - setFilesAndTriggerChange([]); + setFilesAndTriggerChange([]); await futureFile; // It should be already removed from the DOM after the file is resolved. diff --git a/packages/file_selector/file_selector_web/example/integration_test/file_selector_web_test.dart b/packages/file_selector/file_selector_web/example/integration_test/file_selector_web_test.dart index c16aa1cf454e..fe57d1d1e15d 100644 --- a/packages/file_selector/file_selector_web/example/integration_test/file_selector_web_test.dart +++ b/packages/file_selector/file_selector_web/example/integration_test/file_selector_web_test.dart @@ -4,11 +4,12 @@ import 'dart:html'; import 'dart:typed_data'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:integration_test/integration_test.dart'; + import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; import 'package:file_selector_web/file_selector_web.dart'; import 'package:file_selector_web/src/dom_helper.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; void main() { group('FileSelectorWeb', () { @@ -16,23 +17,25 @@ void main() { group('openFile', () { testWidgets('works', (WidgetTester _) async { - final mockFile = createXFile('1001', 'identity.png'); + final XFile mockFile = createXFile('1001', 'identity.png'); - final mockDomHelper = MockDomHelper() - ..setFiles([mockFile]) + final MockDomHelper mockDomHelper = MockDomHelper() + ..setFiles([mockFile]) ..expectAccept('.jpg,.jpeg,image/png,image/*') ..expectMultiple(false); - final plugin = FileSelectorWeb(domHelper: mockDomHelper); + final FileSelectorWeb plugin = + FileSelectorWeb(domHelper: mockDomHelper); - final typeGroup = XTypeGroup( + final XTypeGroup typeGroup = XTypeGroup( label: 'images', - extensions: ['jpg', 'jpeg'], - mimeTypes: ['image/png'], - webWildCards: ['image/*'], + extensions: ['jpg', 'jpeg'], + mimeTypes: ['image/png'], + webWildCards: ['image/*'], ); - final file = await plugin.openFile(acceptedTypeGroups: [typeGroup]); + final XFile file = + await plugin.openFile(acceptedTypeGroups: [typeGroup]); expect(file.name, mockFile.name); expect(await file.length(), 4); @@ -43,22 +46,24 @@ void main() { group('openFiles', () { testWidgets('works', (WidgetTester _) async { - final mockFile1 = createXFile('123456', 'file1.txt'); - final mockFile2 = createXFile('', 'file2.txt'); + final XFile mockFile1 = createXFile('123456', 'file1.txt'); + final XFile mockFile2 = createXFile('', 'file2.txt'); - final mockDomHelper = MockDomHelper() - ..setFiles([mockFile1, mockFile2]) + final MockDomHelper mockDomHelper = MockDomHelper() + ..setFiles([mockFile1, mockFile2]) ..expectAccept('.txt') ..expectMultiple(true); - final plugin = FileSelectorWeb(domHelper: mockDomHelper); + final FileSelectorWeb plugin = + FileSelectorWeb(domHelper: mockDomHelper); - final typeGroup = XTypeGroup( + final XTypeGroup typeGroup = XTypeGroup( label: 'files', - extensions: ['.txt'], + extensions: ['.txt'], ); - final files = await plugin.openFiles(acceptedTypeGroups: [typeGroup]); + final List files = + await plugin.openFiles(acceptedTypeGroups: [typeGroup]); expect(files.length, 2); @@ -76,8 +81,8 @@ void main() { group('getSavePath', () { testWidgets('returns non-null', (WidgetTester _) async { - final plugin = FileSelectorWeb(); - final savePath = plugin.getSavePath(); + final FileSelectorWeb plugin = FileSelectorWeb(); + final Future savePath = plugin.getSavePath(); expect(await savePath, isNotNull); }); }); @@ -99,7 +104,7 @@ class MockDomHelper implements DomHelper { reason: 'Expected "accept" value does not match.'); expect(multiple, _expectedMultiple, reason: 'Expected "multiple" value does not match.'); - return Future.value(_files); + return Future>.value(_files); } void setFiles(List files) { @@ -116,6 +121,6 @@ class MockDomHelper implements DomHelper { } XFile createXFile(String content, String name) { - final data = Uint8List.fromList(content.codeUnits); + final Uint8List data = Uint8List.fromList(content.codeUnits); return XFile.fromData(data, name: name, lastModified: DateTime.now()); } diff --git a/packages/file_selector/file_selector_web/example/lib/main.dart b/packages/file_selector/file_selector_web/example/lib/main.dart index e1a38dcdcd46..341913a18490 100644 --- a/packages/file_selector/file_selector_web/example/lib/main.dart +++ b/packages/file_selector/file_selector_web/example/lib/main.dart @@ -17,7 +17,7 @@ class MyApp extends StatefulWidget { class _MyAppState extends State { @override Widget build(BuildContext context) { - return Directionality( + return const Directionality( textDirection: TextDirection.ltr, child: Text('Testing... Look at the console output for results!'), ); diff --git a/packages/file_selector/file_selector_web/lib/file_selector_web.dart b/packages/file_selector/file_selector_web/lib/file_selector_web.dart index f7c10b36a186..8f4ca202593e 100644 --- a/packages/file_selector/file_selector_web/lib/file_selector_web.dart +++ b/packages/file_selector/file_selector_web/lib/file_selector_web.dart @@ -3,16 +3,23 @@ // found in the LICENSE file. import 'dart:async'; -import 'package:meta/meta.dart'; -import 'package:flutter_web_plugins/flutter_web_plugins.dart'; + import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; import 'package:file_selector_web/src/dom_helper.dart'; import 'package:file_selector_web/src/utils.dart'; +import 'package:flutter_web_plugins/flutter_web_plugins.dart'; +import 'package:meta/meta.dart'; /// The web implementation of [FileSelectorPlatform]. /// /// This class implements the `package:file_selector` functionality for the web. 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}) + : _domHelper = domHelper ?? DomHelper(); + final DomHelper _domHelper; /// Registers this class as the default instance of [FileSelectorPlatform]. @@ -20,19 +27,14 @@ class FileSelectorWeb extends FileSelectorPlatform { FileSelectorPlatform.instance = FileSelectorWeb(); } - /// 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}) - : _domHelper = domHelper ?? DomHelper(); - @override Future openFile({ List? acceptedTypeGroups, String? initialDirectory, String? confirmButtonText, }) async { - final files = await _openFiles(acceptedTypeGroups: acceptedTypeGroups); + final List files = + await _openFiles(acceptedTypeGroups: acceptedTypeGroups); return files.first; } @@ -68,7 +70,7 @@ class FileSelectorWeb extends FileSelectorPlatform { List? acceptedTypeGroups, bool multiple = false, }) async { - final accept = acceptedTypesToString(acceptedTypeGroups); + final String accept = acceptedTypesToString(acceptedTypeGroups); return _domHelper.getFiles( accept: accept, multiple: multiple, diff --git a/packages/file_selector/file_selector_web/lib/src/dom_helper.dart b/packages/file_selector/file_selector_web/lib/src/dom_helper.dart index 0d251af9cc7f..06c13d968484 100644 --- a/packages/file_selector/file_selector_web/lib/src/dom_helper.dart +++ b/packages/file_selector/file_selector_web/lib/src/dom_helper.dart @@ -4,27 +4,28 @@ import 'dart:async'; import 'dart:html'; -import 'package:meta/meta.dart'; -import 'package:flutter/services.dart'; + import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; +import 'package:flutter/services.dart'; +import 'package:meta/meta.dart'; /// Class to manipulate the DOM with the intention of reading files from it. class DomHelper { - final _container = Element.tag('file-selector'); - /// Default constructor, initializes the container DOM element. DomHelper() { - final body = querySelector('body')!; + final Element body = querySelector('body')!; body.children.add(_container); } + final Element _container = Element.tag('file-selector'); + /// Sets the attributes and waits for a file to be selected. Future> getFiles({ String accept = '', bool multiple = false, @visibleForTesting FileUploadInputElement? input, }) { - final Completer> completer = Completer(); + final Completer> completer = Completer>(); final FileUploadInputElement inputElement = input ?? FileUploadInputElement(); @@ -41,9 +42,9 @@ class DomHelper { completer.complete(files); }); - inputElement.onError.first.then((event) { + inputElement.onError.first.then((Event event) { final ErrorEvent error = event as ErrorEvent; - final platformException = PlatformException( + final PlatformException platformException = PlatformException( code: error.type, message: error.message, ); diff --git a/packages/file_selector/file_selector_web/lib/src/utils.dart b/packages/file_selector/file_selector_web/lib/src/utils.dart index e52c00d1c223..6a534645fda6 100644 --- a/packages/file_selector/file_selector_web/lib/src/utils.dart +++ b/packages/file_selector/file_selector_web/lib/src/utils.dart @@ -6,9 +6,11 @@ import 'package:file_selector_platform_interface/file_selector_platform_interfac /// Convert list of XTypeGroups to a comma-separated string String acceptedTypesToString(List? acceptedTypes) { - if (acceptedTypes == null) return ''; - final List allTypes = []; - for (final group in acceptedTypes) { + if (acceptedTypes == null) { + return ''; + } + final List allTypes = []; + for (final XTypeGroup group in acceptedTypes) { _assertTypeGroupIsValid(group); if (group.extensions != null) { allTypes.addAll(group.extensions!.map(_normalizeExtension)); diff --git a/packages/file_selector/file_selector_web/test/utils_test.dart b/packages/file_selector/file_selector_web/test/utils_test.dart index 2951af24dff9..9bddfd2e6304 100644 --- a/packages/file_selector/file_selector_web/test/utils_test.dart +++ b/packages/file_selector/file_selector_web/test/utils_test.dart @@ -2,54 +2,55 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -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'; +import 'package:file_selector_web/src/utils.dart'; +import 'package:flutter_test/flutter_test.dart'; void main() { group('FileSelectorWeb utils', () { group('acceptedTypesToString', () { test('works', () { - final List acceptedTypes = [ - XTypeGroup(label: 'images', webWildCards: ['images/*']), - XTypeGroup(label: 'jpgs', extensions: ['jpg', 'jpeg']), - XTypeGroup(label: 'pngs', mimeTypes: ['image/png']), + final List acceptedTypes = [ + XTypeGroup(label: 'images', webWildCards: ['images/*']), + XTypeGroup(label: 'jpgs', extensions: ['jpg', 'jpeg']), + XTypeGroup(label: 'pngs', mimeTypes: ['image/png']), ]; - final accepts = acceptedTypesToString(acceptedTypes); + final String accepts = acceptedTypesToString(acceptedTypes); expect(accepts, 'images/*,.jpg,.jpeg,image/png'); }); test('works with an empty list', () { - final List acceptedTypes = []; - final accepts = acceptedTypesToString(acceptedTypes); + final List acceptedTypes = []; + final String accepts = acceptedTypesToString(acceptedTypes); expect(accepts, ''); }); test('works with extensions', () { - final List acceptedTypes = [ - XTypeGroup(label: 'jpgs', extensions: ['jpeg', 'jpg']), - XTypeGroup(label: 'pngs', extensions: ['png']), + final List acceptedTypes = [ + XTypeGroup(label: 'jpgs', extensions: ['jpeg', 'jpg']), + XTypeGroup(label: 'pngs', extensions: ['png']), ]; - final accepts = acceptedTypesToString(acceptedTypes); + final String accepts = acceptedTypesToString(acceptedTypes); expect(accepts, '.jpeg,.jpg,.png'); }); test('works with mime types', () { - final List acceptedTypes = [ - XTypeGroup(label: 'jpgs', mimeTypes: ['image/jpeg', 'image/jpg']), - XTypeGroup(label: 'pngs', mimeTypes: ['image/png']), + final List acceptedTypes = [ + XTypeGroup( + label: 'jpgs', mimeTypes: ['image/jpeg', 'image/jpg']), + XTypeGroup(label: 'pngs', mimeTypes: ['image/png']), ]; - final accepts = acceptedTypesToString(acceptedTypes); + final String accepts = acceptedTypesToString(acceptedTypes); expect(accepts, 'image/jpeg,image/jpg,image/png'); }); test('works with web wild cards', () { - final List acceptedTypes = [ - XTypeGroup(label: 'images', webWildCards: ['image/*']), - XTypeGroup(label: 'audios', webWildCards: ['audio/*']), - XTypeGroup(label: 'videos', webWildCards: ['video/*']), + final List acceptedTypes = [ + XTypeGroup(label: 'images', webWildCards: ['image/*']), + XTypeGroup(label: 'audios', webWildCards: ['audio/*']), + XTypeGroup(label: 'videos', webWildCards: ['video/*']), ]; - final accepts = acceptedTypesToString(acceptedTypes); + final String accepts = acceptedTypesToString(acceptedTypes); expect(accepts, 'image/*,audio/*,video/*'); }); }); diff --git a/script/configs/custom_analysis.yaml b/script/configs/custom_analysis.yaml index 2e214757d90d..71d8fb825add 100644 --- a/script/configs/custom_analysis.yaml +++ b/script/configs/custom_analysis.yaml @@ -16,7 +16,6 @@ # TODO(ecosystem): Remove everything from this list. See: # https://github.com/flutter/flutter/issues/76229 - camera -- file_selector - google_maps_flutter - google_sign_in - image_picker