Skip to content

Commit 87811ff

Browse files
committed
Improved web support for FormBuilderImagePicker
1 parent c60000b commit 87811ff

File tree

2 files changed

+65
-28
lines changed

2 files changed

+65
-28
lines changed

lib/src/fields/form_builder_image_picker.dart

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:flutter/foundation.dart';
12
import 'package:flutter/material.dart';
23
import 'package:flutter_form_builder/flutter_form_builder.dart';
34
import 'package:flutter_form_builder/src/widgets/image_source_sheet.dart';
@@ -29,8 +30,13 @@ class FormBuilderImagePicker extends FormBuilderField {
2930

3031
final Function(Image) onImage;
3132
final int maxImages;
33+
final Widget cameraIcon;
34+
final Widget galleryIcon;
35+
final Widget cameraLabel;
36+
final Widget galleryLabel;
37+
final EdgeInsets bottomSheetPadding;
3238

33-
FormBuilderImagePicker({
39+
FormBuilderImagePicker( {
3440
Key key,
3541
//From Super
3642
@required String name,
@@ -55,6 +61,11 @@ class FormBuilderImagePicker extends FormBuilderField {
5561
this.preferredCameraDevice = CameraDevice.rear,
5662
this.onImage,
5763
this.maxImages,
64+
this.cameraIcon = const Icon(Icons.camera_enhance),
65+
this.galleryIcon = const Icon(Icons.image),
66+
this.cameraLabel = const Text('Camera'),
67+
this.galleryLabel = const Text('Gallery'),
68+
this.bottomSheetPadding = const EdgeInsets.all(0),
5869
}) : assert(maxImages == null || maxImages >= 0),
5970
super(
6071
key: key,
@@ -94,9 +105,11 @@ class FormBuilderImagePicker extends FormBuilderField {
94105
width: previewWidth,
95106
height: previewHeight,
96107
margin: previewMargin,
97-
child: item is String
98-
? Image.network(item, fit: BoxFit.cover)
99-
: Image.file(item, fit: BoxFit.cover),
108+
child: kIsWeb
109+
? Image.memory(item, fit: BoxFit.cover)
110+
: item is String
111+
? Image.network(item, fit: BoxFit.cover)
112+
: Image.file(item, fit: BoxFit.cover),
100113
),
101114
if (!state.readOnly)
102115
InkWell(
@@ -141,15 +154,27 @@ class FormBuilderImagePicker extends FormBuilderField {
141154
showModalBottomSheet(
142155
context: state.context,
143156
builder: (_) {
144-
return ImageSourceSheet(
157+
return ImageSourceBottomSheet(
145158
maxHeight: maxHeight,
146159
maxWidth: maxWidth,
147160
imageQuality: imageQuality,
148161
preferredCameraDevice: preferredCameraDevice,
162+
bottomSheetPadding: bottomSheetPadding,
163+
cameraIcon: cameraIcon,
164+
cameraLabel: cameraLabel,
165+
galleryIcon: galleryIcon,
166+
galleryLabel: galleryLabel,
149167
onImageSelected: (image) {
150168
state.requestFocus();
151-
field
152-
.didChange([...field.value ?? [], image]);
169+
field.didChange([
170+
...field.value ?? [],
171+
image,
172+
]);
173+
Navigator.of(state.context).pop();
174+
},
175+
onImage: (image) {
176+
field.didChange([...field.value, image]);
177+
onChanged?.call(field.value);
153178
Navigator.of(state.context).pop();
154179
},
155180
);

lib/src/widgets/image_source_sheet.dart

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import 'dart:io';
2+
import 'dart:typed_data' show Uint8List;
23

3-
import 'package:flutter/material.dart';
44
import 'package:flutter/foundation.dart';
5+
import 'package:flutter/material.dart';
56
import 'package:image_picker/image_picker.dart';
67

7-
class ImageSourceSheet extends StatelessWidget {
8+
class ImageSourceBottomSheet extends StatelessWidget {
89
/// Optional maximum height of image
910
final double maxHeight;
1011

@@ -25,22 +26,33 @@ class ImageSourceSheet extends StatelessWidget {
2526
/// Callback when an image is selected.
2627
///
2728
/// **Note**: This will work on web platform whereas [onImageSelected] will not.
28-
final Function(Image) onImage;
29+
final Function(Uint8List) onImage;
2930

3031
/// Callback when an image is selected.
3132
///
3233
/// **Warning**: This will _NOT_ work on web platform because [File] is not
3334
/// available.
3435
final Function(File) onImageSelected;
3536

36-
ImageSourceSheet({
37+
final Widget cameraIcon;
38+
final Widget galleryIcon;
39+
final Widget cameraLabel;
40+
final Widget galleryLabel;
41+
final EdgeInsets bottomSheetPadding;
42+
43+
ImageSourceBottomSheet({
3744
Key key,
3845
this.maxHeight,
3946
this.maxWidth,
4047
this.imageQuality,
4148
this.preferredCameraDevice = CameraDevice.rear,
4249
this.onImage,
4350
this.onImageSelected,
51+
this.cameraIcon,
52+
this.galleryIcon,
53+
this.cameraLabel,
54+
this.galleryLabel,
55+
this.bottomSheetPadding,
4456
}) : assert(null != onImage || null != onImageSelected),
4557
super(key: key);
4658

@@ -54,36 +66,36 @@ class ImageSourceSheet extends StatelessWidget {
5466
preferredCameraDevice: preferredCameraDevice,
5567
);
5668
if (null != pickedFile) {
57-
if (null != onImage) {
58-
final image = Image.memory(await pickedFile.readAsBytes());
59-
onImage(image);
60-
}
61-
62-
if (null != onImageSelected) {
63-
// Warning: this will not work on the web platform because pickedFile
64-
// will instead point to a network resource.
65-
assert(!kIsWeb);
66-
67-
final imageFile = File(pickedFile.path);
68-
assert(null != imageFile);
69-
onImageSelected(imageFile);
69+
if (kIsWeb) {
70+
if (null != onImage) {
71+
onImage(await pickedFile.readAsBytes());
72+
}
73+
} else {
74+
if (null != onImageSelected) {
75+
// Warning: this will not work on the web platform because pickedFile
76+
// will instead point to a network resource.
77+
final imageFile = File(pickedFile.path);
78+
assert(null != imageFile);
79+
onImageSelected(imageFile);
80+
}
7081
}
7182
}
7283
}
7384

7485
@override
7586
Widget build(BuildContext context) {
7687
return Container(
88+
padding: bottomSheetPadding,
7789
child: Wrap(
7890
children: <Widget>[
7991
ListTile(
80-
leading: const Icon(Icons.camera_enhance),
81-
title: Text('Camera'),
92+
leading: cameraIcon,
93+
title: cameraLabel,
8294
onTap: () => _onPickImage(ImageSource.camera),
8395
),
8496
ListTile(
85-
leading: const Icon(Icons.image),
86-
title: Text('Gallery'),
97+
leading: galleryIcon,
98+
title: galleryLabel,
8799
onTap: () => _onPickImage(ImageSource.gallery),
88100
)
89101
],

0 commit comments

Comments
 (0)