firebase 将Stream Building与特定Firestore文档一起使用

oknwwptz  于 2023-01-18  发布在  其他
关注(0)|答案(3)|浏览(115)

我正在构建一个Flutter应用程序,我在理解如何实现Firestore方面遇到了困难。在我看过的教程中,我只看到了如何创建整个集合的快照,然而在我的情况下,我的集合是用户,所以我只需要快照一个特定用户的文档。Firebase文档上似乎没有关于如何做到这一点的文档,FlutterFire GitHub页面上也没有太多文档。请帮助!
这是我尝试用StreamBuilder构建的小部件。

@override
  Widget build(BuildContext context) {
    return new StreamBuilder(
      stream: Firestore.instance.collection('users').document(userId).snapshots(),
      builder: (context, snapshot) {
        return new ListView.builder(
          itemCount: //what do I put here?,
          itemBuilder: (context, index) => new Item(//And here?),
        );
      }
    );
  }
ndh0cuux

ndh0cuux1#

假设您想从文档中创建一个带有name参数的Text

Widget build(BuildContext context) {
  String userId = "skdjfkasjdkfja";
  return StreamBuilder(
      stream: Firestore.instance.collection('users').document(userId).snapshots(),
      builder: (context, AsyncSnapshot<DocumentSnapshot> snapshot) {
        if (!snapshot.hasData) {
          return Text("Loading");
        }
        var userDocument = snapshot.data;
        return Text(userDocument["name"]);
      }
  );
}

这只是一个示例。在文档上创建StreamBuilder将在每次更改文档本身时重新生成。您可以尝试此代码,然后转到您的控制台并更改“名称”值。您的应用将自动反映更改。
您可以使用流中的数据构建整个树,而不是只构建一个Text
如果您希望获得文档的即时值,可以通过解析文档引用上的get()方法的Future来实现。

var document = await Firestore.instance.collection('users').document(userId).get(),
rqcrx0a6

rqcrx0a62#

每个元素都应强制转换为在代码的后面有一个引用。

return new StreamBuilder<DocumentSnapshot>(
      stream: Firestore.instance.collection('users').document(userId).snapshots(), //returns a Stream<DocumentSnapshot>
      builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
        if (!snapshot.hasData) {
          return new Text("Loading");
        }
        var userDocument = snapshot.data;
        return new Text(userDocument["name"]);
      }
  );
}
inb24sb2

inb24sb23#

使用null safety更新2023

class _UserInformationState extends State<UserInformation> {
  final _usersStream = FirebaseFirestore.instance
      .collection('users')
      .doc(FirebaseAuth.instance.currentUser!.uid) // 👈 Your document id change accordingly
      .snapshots();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: StreamBuilder<DocumentSnapshot<Map<String, dynamic>>>(
          stream: _usersStream,
          builder:
              (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
            if (snapshot.hasError) {
              return const Text('Something went wrong');
            }
            if (snapshot.connectionState == ConnectionState.waiting) {
              return const Text("Loading");
            }
            Map<String, dynamic> data =
                snapshot.data!.data()! as Map<String, dynamic>;
            return Text(data['fullName']);
          },
        ),
      ),
    );
  }
}

相关问题