Trabalhando com a dependência do Imager Picker no Flutter
Tenho uma função em meu aplicativo que ajuda o usuário a escolher a imagem da galeria ou tirar uma foto com a câmera.
_getImage(ImageSource source) async {
// ignore: deprecated_member_use
File selectedImage = await ImagePicker.pickImage(
source: source,
imageQuality: 50,
maxWidth: 400.0,
).whenComplete(() {
setState(() {});
});
if (_imageFile == null) return;
setState(() {
_imageFile = selectedImage;
});
}
Estou usando esta dependência image_picker e segui o exemplo que encontrei nele e também exemplos de possíveis atualizações feitas por outras pessoas online. A partir de uma sugestão sobre esta questão stackoverflow , fui aconselhado a adicionar o whenComplete nela, o que fiz.
Quando eu seleciono uma imagem da minha galeria, ele não atualiza o widget de visualização da imagem na minha tela. Nem a opção de câmera funciona. O que eu poderia estar faltando?
Este é meu widget de imagem que exibe a imagem:
return Stack(
alignment: AlignmentDirectional.bottomCenter,
children: <Widget>[
Image.file(
_imageFile,
fit: BoxFit.cover,
height: 250,
),
Container(
width: 250.0,
height: 100.0,
color: Colors.black54,
child: Column(
children: <Widget>[
Text(
'Change Image',
style: TextStyle(
color: Colors.white,
fontSize: 22.0,
fontWeight: FontWeight.w400,
),
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
//camera button
IconButton(
icon: Icon(FontAwesomeIcons.camera),
onPressed: () => _getImage(ImageSource.camera),
color: kThemeStyleButtonFillColour,
),
SizedBox(width: 20.0),
IconButton(
icon: Icon(FontAwesomeIcons.fileImport),
onPressed: () => _getImage(ImageSource.gallery),
color: kThemeStyleButtonFillColour,
),
],
),
],
),
),
SizedBox(height: 32.0),
],
);
Respostas
Você está usando a lógica interna errada if.
Maneira certa de fazer isso,
if(selectedImage != null) { Update image widget here }
Acho que a imageFilevariável não foi atribuída a nenhum arquivo inicialmente, então a condição imageFile == nullé sempre verdadeira e o widget de imagem nunca é atualizado.
** Vou atualizar seu código, tente isso **
import 'package:image_picker/image_picker.dart';
class check extends StatefulWidget {
@override
_checkState createState() => _checkState();
}
class _checkState extends State<check> {
File _imageFile;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Stack(
alignment: AlignmentDirectional.bottomCenter,
children: <Widget>[
_imageFile !=null ? Image.file(
_imageFile ,
height: 250,
fit: BoxFit.fill,
) : Text('No image selected.'),
SizedBox(height: 100,),
Container(
width: 250.0,
height: 100.0,
color: Colors.black54,
child: Column(
children: <Widget>[
Text(
'Change Image',
style: TextStyle(
color: Colors.white,
fontSize: 22.0,
fontWeight: FontWeight.w400,
),
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
//camera button
IconButton(
icon: Icon(Icons.camera),
onPressed: () => _getImage(ImageSource.camera),
),
SizedBox(width: 20.0),
IconButton(
icon: Icon(Icons.attach_file),
onPressed: () => _getImage(ImageSource.gallery),
),
],
),
],
),
),
SizedBox(height: 32.0),
],
)
);
}
_getImage(ImageSource source) async {
// ignore: deprecated_member_use
File selectedImage = await ImagePicker.pickImage(
source: source,
imageQuality: 50,
maxWidth: 400.0,
);
setState(() {
_imageFile = selectedImage;
});
}
}
No seu caso,
setState(() {
_imageFile = selectedImage;
});
Não está esperando a imagem selecionada
Experimente isto:
_getImage(ImageSource source) async {
// ignore: deprecated_member_use
File selectedImage = await ImagePicker.pickImage(
source: source,
imageQuality: 50,
maxWidth: 400.0,
);
setState(() {
_imageFile = selectedImage;
});
}
Consegui fazer esse código funcionar e o hack ainda me bate porque não faz sentido.
Eu segui a recomendação dada acima, eliminando whenComplete, pois há uma espera.
Eu também alterei o tipo de declaração de selectedImage de File para var conforme abaixo:
_getImage(ImageSource source) async {
var selectedImage;
selectedImage = await ImagePicker.pickImage(
source: source,
imageQuality: 50,
maxWidth: 400.0,
);
setState(() {
_imageFile = selectedImage;
});
}
Não faz sentido por que var funcionou e File não, já que sabemos que estamos esperando um File como valor de retorno, mas funciona bem agora.