2 votes

Problème avec StatefulWidget incapable de faire les changements désirés

Je travaille sur un StatefulWidget et mon but est de m'assurer que le bouton suivant n'est pas cliquable jusqu'à ce qu'une option (dans cette langue est sélectionnée). Cependant, cela ne semble pas fonctionner, j'ai également ajouté la réponse de Yaesin à code

 ListView.builder(
            itemCount: histoires.length,
            itemBuilder: (context, index) {
              return ListTile(
                  title: Text(
                    histoires[index].title,
                    style: TextStyle(color: Colors.pink),
                  ),
                  trailing: IconButton(
                      icon: Icon(Icons.play_arrow),
                      onPressed: () {
                        showDialog(
                            context: context,
                            builder: (BuildContext context) {
                              return StatefulBuilder(
                                  builder: (context, setState) =>
                                      AlertDialog(
                                        content: Column(children: [
                                          InkWell(
                                              onTap: () {
                                                _handleTap;
                                              },
                                              child: ListTile(
                                                  trailing: Icon(Icons
                                                      .flag_circle_rounded),
                                                  title: Text(
                                                    "Français",
                                                    style: TextStyle(
                                                        color: Colors
                                                            .blueGrey),
                                                  ))),
                                          _active
                                              ? InkWell(
                                                  onTap: () {},
                                                  child: Image.asset(
                                                      "assets/nextactive.png",
                                                      height: height * 0.2,
                                                      width: width * 0.4),
                                                )
                                              : Image.asset(
                                                  "assets/nextinactive.png",
                                                  height: height * 0,
                                                  width: width * 0)
                                        ]),
                                      ));
                            });
                      }));
            }),

3voto

Yeasin Sheikh Points 22

Pour mettre à jour l'interface utilisateur du dialogue, vous pouvez utiliser setState de StatefulBuilder

 return StatefulBuilder(
    builder: (context, setState) =>  
      AlertDialog(
          content: Column(children: [

Lors de l'utilisation d'une méthode distincte, transmettez le setState de StatefulBuilder à la fonction. Dans votre cas, cela sera

onPressed: () async {
  await showDialog(
      context: context,
      builder: (BuildContext context) {
        return StatefulBuilder(
            builder: (context, setStateSB) => AlertDialog(
                  content: Column(children: [
                    InkWell(
                        onTap: () {
                          _handleTap(setStateSB);
                        },
                        child: ListTile(

Assurez-vous également de recevoir ce setStateSB (renommé pour éviter toute confusion avec setState de l'état).

_handleTap(setStateSB){ ....

En savoir plus sur l'utilisation de StatefulBuilder

2voto

MendelG Points 4355

Étant donné que vous êtes dans un Dialog, pour que setState fonctionne, vous devez l'encadrer avec un StatefulBuilder.

Comme vous n'avez pas inclus tout votre code, j'utilise cet exemple pris dans la documentation:

await showDialog(
  context: context,
  builder: (BuildContext context) {
    int? selectedRadio = 0;
    return AlertDialog(
      content: StatefulBuilder(
        builder: (BuildContext context, StateSetter setState) {
          return Column(
            mainAxisSize: MainAxisSize.min,
            children: List.generate(4, (int index) {
              return Radio(
                value: index,
                groupValue: selectedRadio,
                onChanged: (int? value) {
                  setState(() => selectedRadio = value);
                },
              );
            }),
          );
        },
      ),
    );
  },
);

Voir aussi

Une vidéo YouTube de l'équipe Flutter expliquant StatefulBuilder

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X