Как получить Firestore.instance.collection (), который является Future <String>? - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь получить некоторые данные из моей Firebase, используя Firestore.instance.collection (currentUser), но currentUser - это Future.How я могу это сделать?

У меня есть следующее

class FoodCart extends StatefulWidget {
  @override
  _FoodCartState createState() => _FoodCartState();
}

class _FoodCartState extends State<FoodCart> {

  @override
  Widget build(BuildContext context) {

    String currentUser;
    firebaseHelper().getCurrentUser().then((result){
      currentUser = result;
    });

    return Scaffold(
      appBar: AppBar(
        title: Text("FoodCart"),
        backgroundColor: Colors.lightBlue,
      ),
      body: StreamBuilder<QuerySnapshot>(//recover data from firebase and shows in the listview
        stream: Firestore.instance.collection(currentUser).snapshots(),
        builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
          if (snapshot.hasError)
            return new Text('Error: ${snapshot.error}');
          switch (snapshot.connectionState) {
            case ConnectionState.waiting: return new Text('Loading...');
            default:
              return new ListView(
                children: snapshot.data.documents.map((DocumentSnapshot document) {
                  return foodCard(document['name'],document['description']);
                }).toList(),
              );
          }
        },
      ),
    );
  }
}

В моем firebaseHelper () у меня есть:

...
    Future<String> getCurrentUser() async{
      FirebaseUser user = await FirebaseAuth.instance.currentUser();
      if(user != null){//if exists a current user, then
        return user.uid;
      }else{
        return null;
      }
    }
...

Но в потоке : Firestore.instance.collection (currentUser) .snapshots () , currentUser всегда возвращает нуль, потому что currentUser = result присваивается внутри функции Future (затем). Другими словами, мне нужно использовать результат функции Future внутри поля, которое нуждается в функции String. Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

То, что вы можете сделать, это перерисовать представление, это делается с помощью функции setState ({});

class FoodCart extends StatefulWidget {
  @override
  _FoodCartState createState() => _FoodCartState();
}

class _FoodCartState extends State<FoodCart> {
// global variable
String currentUser;

// -------------- create this method to get the current user
 Future<Null> _getCurrentUser() async {
    var result = await firebaseHelper().getCurrentUser();

//we notified that there was a change and that the UI should be rendered
    setState(() {
      currentUser = result;
    });
  }
 // Add this method
  Widget buildBody() {
    if (this.currentUser == null) {
      return Container();
    } else {
      return StreamBuilder<QuerySnapshot>(//recover data from firebase and shows in the listview
        stream: Firestore.instance.collection(currentUser).snapshots(),
        builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
          if (snapshot.hasError)
            return new Text('Error: ${snapshot.error}');
          switch (snapshot.connectionState) {
            case ConnectionState.waiting: return new Text('Loading...');
            default:
              return new ListView(
                children: snapshot.data.documents.map((DocumentSnapshot document) {
                  return foodCard(document['name'],document['description']);
                }).toList(),
              );
          }
        },
      );
    }
  }

// ------------ add this method
@override
  void initState() {
    this._getCurrentUser();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(
        title: Text("FoodCart"),
        backgroundColor: Colors.lightBlue,
      ),
      body: this.buildBody(),
    );
  }
}
0 голосов
/ 25 апреля 2019

Назовите что-то вроде

firebaseHelper().getCurrentUser().then((result){
  setState(() {
    currentUser = result;
  })
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...