Utilisation de la dépendance du sélecteur d'imageur dans Flutter
J'ai une fonction dans mon application qui aide l'utilisateur à choisir l'image de la galerie ou à prendre une photo avec un appareil photo.
_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;
});
}
J'utilise cette dépendance image_picker et j'ai suivi l'exemple que j'y ai trouvé ainsi que des exemples de mises à jour possibles effectuées par d'autres en ligne. À partir d'une suggestion sur cette question de stackoverflow , je suis invité à ajouter le whenComplete, ce que j'ai fait.
Lorsque je sélectionne une image dans ma galerie, cela ne met pas à jour le widget d'affichage d'image sur mon écran. L'option caméra ne fonctionne pas non plus. Que pourrais-je éventuellement manquer?
Voici mon widget Image qui affiche l'image:
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),
],
);
Réponses
Vous utilisez la mauvaise logique dans la ifdéclaration.
Bonne façon de faire cela,
if(selectedImage != null) { Update image widget here }
Je pense que la imageFilevariable n'a pas été affectée initialement à un fichier, donc la condition imageFile == nullest toujours vraie et le widget d'image n'est jamais mis à jour.
** Je mettrai à jour votre code, essayez ceci **
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;
});
}
}
Dans ton cas,
setState(() {
_imageFile = selectedImage;
});
N'attend pas l'image sélectionnée
Essaye ça:
_getImage(ImageSource source) async {
// ignore: deprecated_member_use
File selectedImage = await ImagePicker.pickImage(
source: source,
imageQuality: 50,
maxWidth: 400.0,
);
setState(() {
_imageFile = selectedImage;
});
}
J'ai pu faire fonctionner ce code et le hack me bat toujours parce que ça n'a pas de sens.
J'ai suivi la recommandation ci-dessus en supprimant whenComplete car il y a une attente.
J'ai également changé le type de déclaration de selectedImage from File en var comme ci-dessous:
_getImage(ImageSource source) async {
var selectedImage;
selectedImage = await ImagePicker.pickImage(
source: source,
imageQuality: 50,
maxWidth: 400.0,
);
setState(() {
_imageFile = selectedImage;
});
}
Cela n'a pas de sens pourquoi var a fonctionné et File n'a pas fonctionné puisque nous savons que nous attendons un fichier comme valeur renvoyée, mais cela fonctionne bien maintenant.