import 'package:flutter/material.dart';
|
|
import 'package:image_picker/image_picker.dart';
|
|
|
|
class FilePicker extends StatelessWidget {
|
|
FilePicker({
|
|
Key? key,
|
|
this.cameraHandle,
|
|
this.galleryHandleSingle,
|
|
this.galleryHandleMultiple,
|
|
this.fileHandle,
|
|
}) : super(key: key);
|
|
|
|
final Function(XFile image)? cameraHandle;
|
|
final Function(XFile image)? galleryHandleSingle;
|
|
final Function(List<XFile> images)? galleryHandleMultiple;
|
|
// TODO: Implement. Perhaps after first release?
|
|
final Function()? fileHandle;
|
|
|
|
final ImagePicker _picker = ImagePicker();
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Padding(
|
|
padding: const EdgeInsets.only(top: 10, bottom: 10, left: 5, right: 5),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
_filePickerSelection(
|
|
hasHandle: cameraHandle != null,
|
|
icon: Icons.camera_alt,
|
|
onTap: () async {
|
|
final XFile? image = await _picker.pickImage(source: ImageSource.camera);
|
|
if (image == null) {
|
|
return;
|
|
}
|
|
cameraHandle!(image);
|
|
},
|
|
context: context,
|
|
),
|
|
_filePickerSelection(
|
|
hasHandle: galleryHandleSingle != null,
|
|
icon: Icons.image,
|
|
onTap: () async {
|
|
final XFile? image = await _picker.pickImage(source: ImageSource.gallery);
|
|
if (image == null) {
|
|
return;
|
|
}
|
|
galleryHandleSingle!(image);
|
|
},
|
|
context: context,
|
|
),
|
|
_filePickerSelection(
|
|
hasHandle: galleryHandleMultiple != null,
|
|
icon: Icons.image,
|
|
onTap: () async {
|
|
final List<XFile>? images = await _picker.pickMultiImage();
|
|
if (images == null) {
|
|
return;
|
|
}
|
|
galleryHandleMultiple!(images);
|
|
},
|
|
context: context,
|
|
),
|
|
_filePickerSelection(
|
|
hasHandle: fileHandle != null,
|
|
icon: Icons.file_present_sharp,
|
|
onTap: () {
|
|
},
|
|
context: context,
|
|
),
|
|
],
|
|
)
|
|
);
|
|
}
|
|
|
|
Widget _filePickerSelection({
|
|
required bool hasHandle,
|
|
required IconData icon,
|
|
required Function() onTap,
|
|
required BuildContext context
|
|
}) {
|
|
if (!hasHandle) {
|
|
return const SizedBox.shrink();
|
|
}
|
|
|
|
return Padding(
|
|
padding: const EdgeInsets.only(left: 5, right: 5),
|
|
child: GestureDetector(
|
|
onTap: onTap,
|
|
child: Container(
|
|
height: 75,
|
|
width: 75,
|
|
decoration: BoxDecoration(
|
|
color: Theme.of(context).primaryColor,
|
|
borderRadius: BorderRadius.circular(25),
|
|
),
|
|
child: Icon(
|
|
icon,
|
|
size: 40,
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|