dart - 如何从小部件中的 firestore 检索数据?

标签 dart flutter google-cloud-firestore

在我的用户集合中,存储了 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 的用户名而不是 Richie

提前致谢。

最佳答案

您可以使用 FutureBuilder 来显示用户名,但您还需要获取当前用户,因此如果您在其他地方没有获取当前用户,您可以使用嵌套的 FutureBuilder

您可以使用 connectionState 属性检查 future 的当前状态,并在 connectionState 等待时显示 CircularProgressIndicator()

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
    },
  );

关于dart - 如何从小部件中的 firestore 检索数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55240510/

相关文章:

flutter - APT : error: attribute android:usesPermissionFlags not found

flutter - 显示 Flutter 导航堆栈

javascript - 使用 Angular 从 Firestore 数据库返回多个集合

javascript - 在不循环的情况下查询 Firestore 集合中的所有文档

flutter 多选不起作用或需要类似的东西

javascript - 在 Dart 中扩展 <object>

Flutter:如何将文件引用到 main.dart?

flutter - 我应该在一个页面/屏幕中使用多个 Bloc 来在Flutter中加载不同的状态吗?

firebase - NoSuchMethodError : The getter 'docs' was called on null. flutter

Flutter DropDownButton Popup 按钮下方 200px