как запросить указанное поле данных c из документа во флаттере - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь получить поле из моей базы данных пожарного магазина. Имя поля в базе данных - «dob». Вот код для этого


   FirebaseUser currentUser;
  @override
  void initState() {
    super.initState();
    _loadCurrentUser();
  }

  void _loadCurrentUser() {
    FirebaseAuth.instance.currentUser().then((FirebaseUser user) {
      setState(() { // call setState to rebuild the view
        this.currentUser = user;
      });
    });
  }

  Future<String> email() async {

    if (currentUser != null) {
      String d;
      var usId = currentUser.uid;
      await Firestore.instance.collection('User').document(usId).get().then((data){
        d = (data.data['dob'].toString());  
      });
      return d;
    } else {
      return "no current user";
    }
  }

  @override
  Widget build(BuildContext context) {
    var d = email();
    return Container(
      child: Text('$d'??'no'),
    );
  }
}

После получения данных я пытаюсь отобразить его в текстовом виджете. Но единственное, что виджет Text отображает

Instance of a Future<String>

вместо dob. Я не могу найти, что я делаю неправильно!

1 Ответ

1 голос
/ 22 марта 2020

email() возвращает Future типа String, вы можете попробовать следующее:

 FirebaseUser currentUser;
 String emailResult;
  @override
  void initState() {
    super.initState();
    _loadCurrentUser();
  }

  void _loadCurrentUser() {
    FirebaseAuth.instance.currentUser().then((FirebaseUser user) {
      email(user).then((String result) {
      setState(() { // call setState to rebuild the view
        this.currentUser = user;
        this.emailResult = result;
       });
      });
    });
  }

  Future<String> email(user) async {
    if (user != null) {
      await Firestore.instance.collection('User').document(user.uid).get().then((data){
        d = (data.data['dob'].toString());  
      });
      return d;
    } else {
      return "no current user";
    }
  }


  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text('$emailResult'??'no'),
    );
  }
}

Внутри _loadCurrentUser вызовите метод email() и передайте user как параметр, затем внутри setState() назначьте result для this.emailResult, чтобы вы могли обновить состояние, а затем назначьте emailResult для виджета Text().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...