1
1
import 'dart:io' ;
2
2
3
3
import 'package:flutter/material.dart' ;
4
+ import 'package:flutter/foundation.dart' ;
4
5
import 'package:image_picker/image_picker.dart' ;
5
6
6
7
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.
7
17
final Function (File ) onImageSelected;
8
18
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);
10
39
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
+ }
14
44
}
15
45
}
16
46
@@ -20,22 +50,14 @@ class ImageSourceSheet extends StatelessWidget {
20
50
child: Wrap (
21
51
children: < Widget > [
22
52
ListTile (
23
- leading: Icon (Icons .camera_enhance),
53
+ leading: const Icon (Icons .camera_enhance),
24
54
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),
30
56
),
31
57
ListTile (
32
- leading: Icon (Icons .image),
58
+ leading: const Icon (Icons .image),
33
59
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),
39
61
)
40
62
],
41
63
),
0 commit comments