J'ai une méthode qui vérifie si l'emplacement actuel des utilisateurs est défini, sinon, ouvre une boîte de dialogue d'alerte avec deux boutons: Annuler et Mettre à jour le profil. le onPressed du bouton Mettre à jour le profil permet d'accéder à un deuxième écran avec un formulaire pour mettre à jour l'emplacement des utilisateurs. Le problème est le suivant: si l'utilisateur clique sur le bouton Mettre à jour et met à jour l'emplacement, en cliquant sur le bouton Retour, la première page s'affiche avec la boîte de dialogue d'alerte toujours ouverte. Attente: à la fermeture du bouton de retour et à la mise à jour de l'emplacement, le bouton de retour ouvre le premier écran et actualise toute la page, obtenant le nouvel emplacement. Voir le code: FIRST SCREEN (HOME SCREEN) @override void initState () {super.initState (); getUserDetails (); }

  updateProfileLocationPrompt(BuildContext context) {
  Widget cancelButton = FlatButton(
  child: Text("Cancel",
  ),
  onPressed: () {
    Navigator.of(context).pop(true);
  },
  );
  Widget updateProfileButton = FlatButton(
  child: Text("Update",
  ),
  onPressed: () {
    Navigator.of(context)
        .push(new MaterialPageRoute(builder: (context) => SettingsScreen()));
  },
  );
  AlertDialog alert = AlertDialog(
   title: Text("Update location",
   ),
   content: Text(
    "Please Update you location",
   ),
   actions: [
    cancelButton,
    updateProfileButton,
   ],
  );

   // show the dialog
  showDialog(
  context: context,
  builder: (BuildContext context) {
    return alert;
   },
   );
  }

    getUserDetails() async {
   var firebaseUser = FirebaseAuth.instance.currentUser;

   DocumentSnapshot value = await FirebaseFirestore.instance
    .collection(Str.USERS)
    .doc(firebaseUser.uid)
    .get();
  if (value.data()[Str.ADDRESS].toString() == null ||
    value.data()[Str.ADDRESS].toString() == "") {
  return updateProfileAndLocationPrompt(context);
  } else {
  setState(() {
    searchLocationAddress = value.data()[Str.ADDRESS].toString();//got from firebase
    getItems();
  });
 }
 return;
}

DEUXIÈME ÉCRAN - ÉCRAN DE RÉGLAGES Page normale avec des champs de texte pour mettre à jour l'emplacement de la base de feu. Le problème vraiment: comment revenir à l'écran d'accueil, actualiser l'écran d'accueil avec les nouvelles données et recharger la page, sans ouvrir la boîte de dialogue, car la vérification de l'emplacement une fois définie ne doit pas ouvrir la boîte de dialogue. Actuellement, même si je navigue de la boîte de dialogue vers le deuxième écran, la boîte de dialogue d'alerte est toujours ouverte, l'écran d'accueil n'est pas actualisé avec de nouvelles données.

0
ombiro 1 sept. 2020 à 16:26

2 réponses

Meilleure réponse

Essayer

  Widget updateProfileButton = FlatButton(
  child: Text("Update",
  ),
  onPressed: () async {
    Navigator.pop(context);
    await Navigator.of(context)
        .push(new MaterialPageRoute(builder: (context) => SettingsScreen()));
    setState((){});

  },
  );
1
Zeus 1 sept. 2020 à 13:40

Si vous souhaitez fermer la boîte de dialogue d’alerte, vous devez en sortir dès qu’ils accèdent à l’écran suivant. Pour reconstruire l'écran d'accueil une fois que vous avez cliqué sur retour, vous pouvez utiliser un rappel, donc une fois que vous appuyez sur le bouton retour, il déclenchera le rappel déclaré dans l'écran d'accueil.

Écran d'accueil

void rebuildPage() {
    setState(() {});
  }

onPressed: () {
    Navigator.pop(context);
    Navigator.of(context)
        .push(new MaterialPageRoute(builder: (context) => SettingsScreen(onPressed: rebuildPage)));
  },

Écran des paramètres

 final Function onPressed;
  
 SettingsScreen({ this.onPressed });

 AppBar(
        leading: IconButton(
          icon: Icon(Icons.arrow_back),
          onPressed: () {
            Navigator.pop(context);
            onPressed();
          },
        )
      ),
0
Unbreachable 1 sept. 2020 à 17:34