0
votes

Flutter - Comment renvoyer une valeur d'une fonction à une variable

J'essaye de récupérer un UID de Firebase et de le renvoyer à une variable. Cependant, je suis incapable de le faire fonctionner. Quelqu'un pourrait-il s'il vous plaît aider à ce sujet. Merci

getUID() async {
    final userId = await widget.auth.getCurrentUser();
    print('checking user id ${userId.uid}');
    return userId.uid;
}

@override
void initState() {
  super.initState();
  void foo() async {
    final userID = await getUID();
    print("UID is ${userID}");
  }
  foo();
  print("UID is ${userID}");
}


5 commentaires

Définissez «impossible de le faire fonctionner», quelles erreurs obtenez-vous? Sur quelle ligne ces erreurs se produisent-elles? Que se passe-t-il lorsque vous effectuez une inspection à l'aide d'un débogueur?


Toutes mes excuses. Lorsque j'essaie de l'imprimer comme showin dans la dernière ligne, il est dit que l'ID utilisateur n'est pas défini. J'ai besoin d'obtenir la valeur en dehors de la fonction foo pour la transmettre à d'autres pages.


veuillez ajouter le code de getcurrentuser


Ceci est le code de getCurrentUser du fichier auth.dart Future <FirebaseUser> getCurrentUser () async {FirebaseUser user = wait _firebaseAuth.currentUser (); retour utilisateur; }


Répondu, commentez si quelque chose ne va pas


3 Réponses :


1
votes

Le problème que vous rencontrez est la portée . Vous déclarez userId dans la fonction interne foo , de sorte que la variable n'existe pas en dehors de foo . Si vous souhaitez y accéder dans la portée de initState , vous devez le déclarer dans cette portée:

@override
void initState() {
  super.initState();
  String userId;

  void foo() async {
    userID = await getUID();
    print("UID is ${userID}");
  }

  foo();
  print("UID is ${userID}");
}


4 commentaires

Après avoir appelé la fonction foo () et essayé de l'imprimer, elle apparaît comme "UID est nul". Bien qu'à l'intérieur de la fonction foo, la valeur est imprimée, mais impossible de la récupérer à l'extérieur.


@RaghuCK Le problème est que foo est marqué comme async , mais lorsque vous appelez foo , vous ne l' await pas. Cela oblige initState à le dépasser sans attendre les résultats. Normalement, je dirais simplement que initState asynchrone, mais dans ce cas, Flutter ne vous permettra pas de le faire car toutes les fonctions async renvoient Future et initState doit retourner void .


Merci. Pourriez-vous s'il vous plaît aider à obtenir la valeur de l'ID utilisateur dans une variable afin que je puisse passer à d'autres pages. Ou bien faites-moi savoir comment obtenir l'uid d'un utilisateur depuis Firebase.


@RaghuCK Mettez-le dans une fonction distincte que vous pouvez marquer comme async . Ensuite, vous pouvez await sur foo et définir le résultat sur une variable que vous voulez. Bien que dans cette situation, foo est la fonction séparée et l'ID utilisateur provient vraiment de getUID .



0
votes

Déclarez cela en dehors de chaque classe

class RootPage extends StatefulWidget {

@override
State<StatefulWidget> createState() => new _RootPageState();
}
class _RootPageState extends State<RootPage> {
String _userId;

@override
void initState() {
super.initState();
_userId=getCurrentUser();
}

@override
Widget build(BuildContext context) {
return Text(_userId==null?"NO User Logged In":_userId);
}

et la classe dans laquelle vous l'utilisez devrait être

String getCurrentUser(){
return FirebaseAuth.instance.currentUser;
}

Notez également qu'avec la dernière version de firebaseauth, cette fonction ne renvoie plus de futur;


0 commentaires

0
votes
@override
void initState() {
  super.initState();
  getCurrentUser(); // The code to get the currrent user is run in the initState and user UID stored in the 'userId' variable

}

0 commentaires