Skip to content

Commit ffbc4e4

Browse files
authored
Revised ImageSourceSheet to use the new Image Picker api, and added support for web platform. (#310)
1 parent 3c0cab3 commit ffbc4e4

File tree

1 file changed

+38
-16
lines changed

1 file changed

+38
-16
lines changed

lib/src/widgets/image_source_sheet.dart

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,46 @@
11
import 'dart:io';
22

33
import 'package:flutter/material.dart';
4+
import 'package:flutter/foundation.dart';
45
import 'package:image_picker/image_picker.dart';
56

67
class ImageSourceSheet extends StatelessWidget {
8+
/// Callback when an image is selected.
9+
///
10+
/// **Note**: This will work on web platform whereas [onImageSelected] will not.
11+
final Function(Image) onImage;
12+
13+
/// Callback when an image is selected.
14+
///
15+
/// **Warning**: This will _NOT_ work on web platform because [File] is not
16+
/// available.
717
final Function(File) onImageSelected;
818

9-
ImageSourceSheet({@required this.onImageSelected});
19+
ImageSourceSheet({
20+
Key key,
21+
this.onImage,
22+
this.onImageSelected,
23+
}) : assert(null != onImage || null != onImageSelected),
24+
super(key: key);
25+
26+
Future<void> _onPickImage(ImageSource source) async {
27+
final imagePicker = ImagePicker();
28+
final pickedFile = await imagePicker.getImage(source: source);
29+
if (null != pickedFile) {
30+
if (null != onImage) {
31+
final image = Image.memory(await pickedFile.readAsBytes());
32+
onImage(image);
33+
}
34+
35+
if (null != onImageSelected) {
36+
// Warning: this will not work on the web platform because pickedFile
37+
// will instead point to a network resource.
38+
assert(!kIsWeb);
1039

11-
void imageSelected(File image) async {
12-
if (image != null) {
13-
onImageSelected(image);
40+
final imageFile = File(pickedFile.path);
41+
assert(null != imageFile);
42+
onImageSelected(imageFile);
43+
}
1444
}
1545
}
1646

@@ -20,22 +50,14 @@ class ImageSourceSheet extends StatelessWidget {
2050
child: Wrap(
2151
children: <Widget>[
2252
ListTile(
23-
leading: Icon(Icons.camera_enhance),
53+
leading: const Icon(Icons.camera_enhance),
2454
title: Text('Camera'),
25-
onTap: () async {
26-
File image =
27-
await ImagePicker.pickImage(source: ImageSource.camera);
28-
imageSelected(image);
29-
},
55+
onTap: () => _onPickImage(ImageSource.camera),
3056
),
3157
ListTile(
32-
leading: Icon(Icons.image),
58+
leading: const Icon(Icons.image),
3359
title: Text('Gallery'),
34-
onTap: () async {
35-
File image =
36-
await ImagePicker.pickImage(source: ImageSource.gallery);
37-
imageSelected(image);
38-
},
60+
onTap: () => _onPickImage(ImageSource.gallery),
3961
)
4062
],
4163
),

0 commit comments

Comments
 (0)