Как получить данные из магазина в виджете? - PullRequest
2 голосов
/ 19 марта 2019

В моей коллекции пользователей хранятся такие поля, как photoURL, name.Я хочу показать эти поля в моих виджетах.

Вот мой код для получения текущего пользователя.

  Future<void> _getUserDoc() async {
    final FirebaseAuth _auth = FirebaseAuth.instance;
    final Firestore _firestore = Firestore.instance;

    FirebaseUser user = await _auth.currentUser();
    setState(() {
      userRef = _firestore.collection('users').document(user.uid);
    });
  }

Я не знаю, как получить поля данных.Вот мой виджет для имени.

                  Padding(
                    padding:
                        const EdgeInsets.only(left: 20.0, right: 20.0, top: 10.0),
                    child: Text(
                      'Richie',
                      style: TextStyle(
                          fontFamily: 'Montserrat',
                          fontWeight: FontWeight.bold,
                          fontSize: 17.0),
                    ),
                  ),

Я хочу показать вместо Ричи в текстовом виджете имя пользователя из firestore.

Заранее спасибо.

1 Ответ

1 голос
/ 19 марта 2019

Вы можете использовать FutureBuilder для отображения имени пользователя, но также вам нужно получить текущего пользователя, поэтому, если вы не получаете текущего пользователя где-то еще, вы можете использовать вложенный FutureBuilder s

И вы можете проверить текущее состояние этого будущего с помощью свойства connectionState и показать CircularProgressIndicator() во время ожидания connectionState;

Widget DisplayUserName() {
  return FutureBuilder(
    future: FirebaseAuth.instance.currentUser(),
    builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot) {
      switch (snapshot.connectionState) {
        case ConnectionState.none:
          return Text('Press button to start.');
        case ConnectionState.active:
        case ConnectionState.waiting:
          return Text('Awaiting result...');
        case ConnectionState.done:
          if (snapshot.hasError)
            return Text('Error: ${snapshot.error}');
          return FutureBuilder(
            future: Firestore.instance.collection('users').document(snapshot.data.uid).get(),
            builder: (BuildContext context,
                AsyncSnapshot<DocumentSnapshot> user) {
              switch (user.connectionState) {
                case ConnectionState.none:
                  return Text('Press button to start.');
                case ConnectionState.active:
                case ConnectionState.waiting:
                  return CircularProgressIndicator();
                case ConnectionState.done:
                  if (user.hasError)
                    return Text('Error: ${user.error}');
                  return Padding(
                    padding:
                    const EdgeInsets.only(left: 20.0, right: 20.0, top: 10.0),
                    child: Text(
                      user.data['name'],// Im assuming in CloudFirestore your field name is name.
                      style: TextStyle(
                          fontFamily: 'Montserrat',
                          fontWeight: FontWeight.bold,
                          fontSize: 17.0),
                    ),
                  );
              }
              return null; // unreachable
            },
          );
      }
      return null; // unreachable
    },
  );
}

если у вас есть текущий пользователь в глобальном

  Future<FirebaseUser> user;

  // you may get it in initState
  @override
  void initState() {
    user = FirebaseAuth.instance.currentUser();
    super.initState();
  }

Этого будет достаточно,

  return FutureBuilder(
    future: Firestore.instance.collection('users').document(user.uid).get(),
    builder: (BuildContext context,
        AsyncSnapshot<DocumentSnapshot> user) {
      switch (user.connectionState) {
        case ConnectionState.none:
          return Text('Press button to start.');
        case ConnectionState.active:
        case ConnectionState.waiting:
          return Text('Awaiting result...');
        case ConnectionState.done:
          if (user.hasError)
            return Text('Error: ${user.error}');
          return Padding(
            padding:
            const EdgeInsets.only(left: 20.0, right: 20.0, top: 10.0),
            child: Text(
              user.data['name'],
              style: TextStyle(
                  fontFamily: 'Montserrat',
                  fontWeight: FontWeight.bold,
                  fontSize: 17.0),
            ),
          );
      }
      return null; // unreachable
    },
  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...