nouveau flutter. Je sais comment définir l'état de la boîte de dialogue d'alerte, mais avec la nécessité d'appuyer pour fonctionner comme () => _createPlayer, il ne veut pas reconstruire la boîte de dialogue d'alerte. Je me demande comment définir l'état sur la boîte de dialogue d'alerte lorsque vous devez appuyer dessus.
_createPlayer() { return showDialog( context: context, builder: (BuildContext context) { return AlertDialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(32.0))), content: Container( height: 400, width: 300, child: Column( children: <Widget>[ Text('Create Player', style: Theme .of(context) .textTheme .body1), GestureDetector( onTap: _getImageCamera, child: CircleAvatar( radius: 100, backgroundColor: Colors.white, backgroundImage: _image != null ? FileImage(_image) : AssetImage('assets/images/undercover.png'), ), ), ], ), ), ); }); } _getImageCamera() async{ var image = await ImagePicker.pickImage(source: ImageSource.camera); setState(() { _image = image; }); }
Après avoir appuyé, une boîte de dialogue d'alerte comme celle-ci s'affiche:
File _image; GestureDetector( onTap: () => _createPlayer(),
4 Réponses :
Créez un Dialogue personnalisé de widget avec état distinct pour le AlertDialog et déplacez la variable _image de la fonction _getImageCamera à l'intérieur comme ceci
_createPlayer() { return CustomDialog(); } class CustomDialog extends StatefulWidget { @override State<StatefulWidget> createState() { return CustomDialogState(); } } class CustomDialogState extends State<CustomDialog> { ImageProvider _image; @override void initState() { super.initState(); } @override Widget build(BuildContext context) { return AlertDialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(32.0))), content: Container( height: 400, width: 300, child: Column( children: <Widget>[ Text('Create Player', style: Theme .of(context) .textTheme .body1), GestureDetector( onTap: _getImageCamera, child: CircleAvatar( radius: 100, backgroundColor: Colors.white, backgroundImage: _image != null ? FileImage(_image) : AssetImage('assets/images/undercover.png'), ), ), ], ), ), ); }); } _getImageCamera() async{ var image = await ImagePicker.pickImage(source: ImageSource.camera); setState(() { _image = image; }); } }
Pour voir les modifications de l'interface utilisateur sur showDialog
, vous devez créer un nouveau StatefulWidget
puis travailler avec le dialogue dans cette classe. Voici l'exemple / exemple de code
Vous pouvez utiliser StatefulBuilder pour modifier la boîte de dialogue
showDialog( context: context, builder: (context) { String contentText = "Content of Dialog"; // add StatefulBuilder to return value return StatefulBuilder( builder: (context, setState) { return AlertDialog( title: Text("Title of Dialog"), content: Text(contentText), actions: <Widget>[ FlatButton( onPressed: () => Navigator.pop(context), child: Text("Cancel"), ), FlatButton( onPressed: () { setState(() { contentText = "Changed Content of Dialog"; }); }, child: Text("Change"), ), ], ); }, ); }, );
La solution la plus stupide et la plus rapide est:
Navigator.of(context).pop();
Puis appelez à nouveau le showDialog ()
.
Il y aura un micro delay mais ça marche.