diff --git a/example/lib/media_picker.dart b/example/lib/media_picker.dart index 8940d6f..f823fd0 100644 --- a/example/lib/media_picker.dart +++ b/example/lib/media_picker.dart @@ -97,6 +97,21 @@ class _MediaPickerState extends ConsumerState { Navigator.pop(context); }, ), + MediaPickerInputFile( + pickFile: mediaService.pickFile, + fileExtensions: [ + 'pdf', + 'doc', + 'png', + 'jpg', + 'docx', + 'bmp', + 'gif', + ], + checkPageSettings: { + 'title': 'Bestand delen', + }, + ), ], mediaCheckPage: (Widget displayResult, Map? inputSettings, diff --git a/lib/src/abstracts/media_picker_service.dart b/lib/src/abstracts/media_picker_service.dart index 140c014..fa902a0 100644 --- a/lib/src/abstracts/media_picker_service.dart +++ b/lib/src/abstracts/media_picker_service.dart @@ -4,6 +4,8 @@ import 'dart:typed_data'; +import 'package:file_picker/file_picker.dart'; + abstract class MediaPickerService { /// Returns [Uint8List] based on given [ImageSource]. Future pickImageFile(); @@ -12,5 +14,5 @@ abstract class MediaPickerService { Future pickVideoFile(); /// Returns [Uint8List] based on given [File]. - Future pickFile(); + Future pickFile(List fileExtensions); } diff --git a/lib/src/inputs/input_file.dart b/lib/src/inputs/input_file.dart new file mode 100644 index 0000000..1eca138 --- /dev/null +++ b/lib/src/inputs/input_file.dart @@ -0,0 +1,78 @@ +// SPDX-FileCopyrightText: 2022 Iconica +// +// SPDX-License-Identifier: BSD-3-Clause + +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_media_picker/src/abstracts/media_picker_input.dart'; + +import 'package:path/path.dart' as path; + +import 'package:flutter_media_picker/src/media_result.dart'; + +/// Input for photo used by [MediaPicker]. +class MediaPickerInputFile implements MediaPickerInput { + MediaPickerInputFile({ + this.label = "File", + this.fileExtensions = const ['pdf', 'jpg', 'png'], + this.checkPageSettings, + this.onComplete, + this.pickFile, + }); + + final Future Function(List)? pickFile; + final List fileExtensions; + + @override + String label; + + @override + Future onPressed(BuildContext context) async { + var file = await pickFile?.call(fileExtensions); + + if (file != null && file.files.first.bytes != null) { + return MediaResult( + fileValue: file.files.first.bytes, + fileType: path.extension(file.files.first.name), + fileName: file.files.first.name, + ); + } + return MediaResult(); + } + + @override + Future displayResult(MediaResult result) async { + if (result.fileValue != null) { + switch (result.fileType) { + case '.png': + case '.jpg': + case '.jpeg': + case '.svg': + case '.webp': + case '.bmp': + case '.gif': + return Image.memory( + result.fileValue!, + height: 250, + ); + case '.pdf': + case '.doc': + case '.docx': + return Text(result.fileName!); + default: + } + // return Image.memory( + // result.fileValue!, + // height: 250, + // ); + } + + return Container(); + } + + @override + Map? checkPageSettings; + + @override + void Function(MediaResult value)? onComplete; +} diff --git a/lib/src/inputs/input_photo.dart b/lib/src/inputs/input_photo.dart index b818912..75b375e 100644 --- a/lib/src/inputs/input_photo.dart +++ b/lib/src/inputs/input_photo.dart @@ -26,13 +26,7 @@ class MediaPickerInputPhoto implements MediaPickerInput { @override Future onPressed(BuildContext context) async { - var image = await showModalBottomSheet( - context: context, - backgroundColor: Colors.white, - builder: (BuildContext context) => const ImagePicker( - imagePickerConfig: ImagePickerConfig( - maxHeight: 300, maxWidth: 200, imageQuality: 40), - )); + var image = await pickFile?.call(); if (image != null && image.isNotEmpty) { return MediaResult( diff --git a/lib/src/inputs/inputs.dart b/lib/src/inputs/inputs.dart index 40fa916..9a15183 100644 --- a/lib/src/inputs/inputs.dart +++ b/lib/src/inputs/inputs.dart @@ -6,3 +6,4 @@ export 'input_audio.dart'; export 'input_photo.dart'; export 'input_text.dart'; export 'input_video.dart'; +export 'input_file.dart'; diff --git a/lib/src/media_picker.dart b/lib/src/media_picker.dart index 99253d4..466957c 100644 --- a/lib/src/media_picker.dart +++ b/lib/src/media_picker.dart @@ -187,6 +187,7 @@ class MediaPicker extends ConsumerWidget { MediaResult result = MediaResult( fileValue: content.fileValue, textValue: content.textValue, + fileType: content.fileType, checkPageResults: results, ); diff --git a/lib/src/media_result.dart b/lib/src/media_result.dart index 9e430e5..7a1da26 100644 --- a/lib/src/media_result.dart +++ b/lib/src/media_result.dart @@ -10,6 +10,8 @@ class MediaResult { this.textValue, this.fileValue, this.checkPageResults, + this.fileType, + this.fileName, }); /// For textfield returns actual text, @@ -21,4 +23,10 @@ class MediaResult { /// Returns the values from the checkPageResults if checkpage is set. final Map? checkPageResults; + + /// Returns the filetype when a file is selected with the FilePicker. + final String? fileType; + + /// Returns the file name when a file is selected with the FilePicker. + final String? fileName; } diff --git a/lib/src/service/media_picker_service.dart b/lib/src/service/media_picker_service.dart index 664eb82..3a98ff5 100644 --- a/lib/src/service/media_picker_service.dart +++ b/lib/src/service/media_picker_service.dart @@ -4,6 +4,7 @@ import 'dart:typed_data'; +import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter_media_picker/src/abstracts/media_picker_service.dart'; import 'package:image_picker/image_picker.dart'; @@ -17,7 +18,6 @@ class MediaPickerFileService implements MediaPickerService { @override Future pickImageFile() async { - var image = await ImagePicker().pickImage(source: ImageSource.camera); if (image != null) { @@ -50,7 +50,17 @@ class MediaPickerFileService implements MediaPickerService { } @override - Future pickFile() async { - return null; + Future pickFile(List extensions) async { + var file = await FilePicker.platform.pickFiles( + withData: true, + type: FileType.custom, + allowedExtensions: extensions, + ); + + if (file != null) { + return file; + } + + return Future.value(null); } }