feat: add file picker

This commit is contained in:
Tim 2022-12-22 11:15:08 +01:00
parent cd44468067
commit ef3a839b7f
8 changed files with 120 additions and 11 deletions

View file

@ -97,6 +97,21 @@ class _MediaPickerState extends ConsumerState<MediaPickerPage> {
Navigator.pop(context);
},
),
MediaPickerInputFile(
pickFile: mediaService.pickFile,
fileExtensions: [
'pdf',
'doc',
'png',
'jpg',
'docx',
'bmp',
'gif',
],
checkPageSettings: {
'title': 'Bestand delen',
},
),
],
mediaCheckPage: (Widget displayResult,
Map<String, dynamic>? inputSettings,

View file

@ -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<Uint8List?> pickImageFile();
@ -12,5 +14,5 @@ abstract class MediaPickerService {
Future<Uint8List?> pickVideoFile();
/// Returns [Uint8List] based on given [File].
Future<Uint8List?> pickFile();
Future<FilePickerResult?> pickFile(List<String> fileExtensions);
}

View file

@ -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<FilePickerResult?> Function(List<String>)? pickFile;
final List<String> fileExtensions;
@override
String label;
@override
Future<MediaResult> 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<Widget> 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<String, dynamic>? checkPageSettings;
@override
void Function(MediaResult value)? onComplete;
}

View file

@ -26,13 +26,7 @@ class MediaPickerInputPhoto implements MediaPickerInput {
@override
Future<MediaResult> onPressed(BuildContext context) async {
var image = await showModalBottomSheet<Uint8List?>(
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(

View file

@ -6,3 +6,4 @@ export 'input_audio.dart';
export 'input_photo.dart';
export 'input_text.dart';
export 'input_video.dart';
export 'input_file.dart';

View file

@ -187,6 +187,7 @@ class MediaPicker extends ConsumerWidget {
MediaResult result = MediaResult(
fileValue: content.fileValue,
textValue: content.textValue,
fileType: content.fileType,
checkPageResults: results,
);

View file

@ -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<String, dynamic>? 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;
}

View file

@ -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<Uint8List?> pickImageFile() async {
var image = await ImagePicker().pickImage(source: ImageSource.camera);
if (image != null) {
@ -50,7 +50,17 @@ class MediaPickerFileService implements MediaPickerService {
}
@override
Future<Uint8List?> pickFile() async {
return null;
Future<FilePickerResult?> pickFile(List<String> extensions) async {
var file = await FilePicker.platform.pickFiles(
withData: true,
type: FileType.custom,
allowedExtensions: extensions,
);
if (file != null) {
return file;
}
return Future.value(null);
}
}