Skip to content

Instantly share code, notes, and snippets.

@doyle-flutter
Created September 11, 2021 05:28
Show Gist options
  • Save doyle-flutter/01e07bb22db668920d5f8c6487a99432 to your computer and use it in GitHub Desktop.
Save doyle-flutter/01e07bb22db668920d5f8c6487a99432 to your computer and use it in GitHub Desktop.
Dart 2.14 & Flutter 2.5 Image_picker example
import 'dart:typed_data';
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:gallery_saver/gallery_saver.dart';
import 'package:image_picker/image_picker.dart';
import 'package:permission_handler/permission_handler.dart';
void main() => runApp(Sys());
class Sys extends StatelessWidget {
const Sys({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Main(),
);
}
}
class Main extends StatefulWidget {
@override
State<Main> createState() => _MainState();
}
class _MainState extends State<Main> {
final ImagePicker _picker = ImagePicker();
Uint8List? imgFile;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Camera & ImagePicker & SaverGallery"),
centerTitle: true
),
body: Container(
width: MediaQuery.of(context).size.width,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
this.imgFile == null
? Container(
width: 200.0,
height: 200.0,
color: Colors.red,
alignment: Alignment.center,
child: Text(
"await...",
style: TextStyle(
color: Colors.white
)
)
)
: Container(
width: 200.0,
height: 200.0,
decoration: BoxDecoration(
image: DecorationImage(
image: MemoryImage(this.imgFile!)
)
),
),
MaterialButton(
color: Colors.blue,
textColor: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0)
),
child: Text("Cam & Picker"),
onPressed: () => this._camAndPick(context: context),
),
],
),
),
);
}
Future<void> _camAndPick({required BuildContext context}) async{
if(!await Permission.camera.isGranted){
PermissionStatus camState = await Permission.camera.request();
if(!camState.isGranted) return;
}
if(!await Permission.storage.isGranted){
PermissionStatus storageState = await Permission.storage.request();
if(!storageState.isGranted) return;
}
if(!await Permission.mediaLibrary.isGranted) {
PermissionStatus libState = await Permission.mediaLibrary.request();
if(!libState.isGranted) return;
}
XFile? imgFile = await _picker.pickImage(source: ImageSource.camera);
if(imgFile == null){
ScaffoldMessenger.of(context).showMaterialBanner(
MaterialBanner(
content: Text('No Cam'),
actions: [
TextButton(
child: Text('Close'),
onPressed: () => ScaffoldMessenger.of(context).clearMaterialBanners(),
),
],
)
);
return;
}
bool? _imgSaveCheck = await GallerySaver.saveImage(imgFile.path);
if(_imgSaveCheck == null || !_imgSaveCheck){
ScaffoldMessenger.of(context).showMaterialBanner(
MaterialBanner(
content: Text('Save Err'),
actions: [
TextButton(
child: Text('Close'),
onPressed: () => ScaffoldMessenger.of(context).clearMaterialBanners(),
),
],
)
);
return;
}
XFile? _selectFile = await _picker.pickImage(source: ImageSource.gallery);
if(_selectFile == null){
ScaffoldMessenger.of(context).showMaterialBanner(
MaterialBanner(
content: Text('No File'),
actions: [
TextButton(
child: Text('Close'),
onPressed: () => ScaffoldMessenger.of(context).clearMaterialBanners(),
),
],
)
);
return;
}
this.imgFile = await _selectFile.readAsBytes();
setState((){});
return;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment