Firebase 如何在Firestore中使用Flatter(web app)stream builder

Firebase 如何在Firestore中使用Flatter(web app)stream builder,firebase,flutter,google-cloud-firestore,flutter-web,Firebase,Flutter,Google Cloud Firestore,Flutter Web,我看到了一些关于使用stream builder的Flitter for mobile的问题和答案,如下所示: body: new StreamBuilder( stream: Firestore.instance.collection("collection").snapshots(), builder: (context, snapshot) { ... Stream<List<DocumentSnapshot>> getStream() async

我看到了一些关于使用stream builder的Flitter for mobile的问题和答案,如下所示:

body: new StreamBuilder(
  stream: Firestore.instance.collection("collection").snapshots(),
  builder: (context, snapshot) {
    ...
Stream<List<DocumentSnapshot>> getStream() async* {
  fb.firestore().collection("MyCollection").onSnapshot.listen((querySnapshot) {
    yield querySnapshot.docs;
  }
}
我正试图在flutter上为web执行同样的操作,但是在我的配置中,snapshots方法是未知的,在运行时会生成一个异常,并在运行之前生成一个vscode警告。为什么?我的设置是否不正确

我遵循了我在这里和其他地方发现的这些步骤:

1在pubspec.yaml中包含firebase作为依赖项

dependencies:
  flutter:
    sdk: flutter
  firebase: ^6.0.0
2在index.html body标记中包含firestore js脚本:

<script src="https://www.gstatic.com/firebasejs/7.5.0/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/7.5.0/firebase-analytics.js"></script>
<script src="https://www.gstatic.com/firebasejs/7.5.0/firebase-firestore.js"></script>
<script src="main.dart.js" type="application/javascript"></script>
遵循这些步骤后,我可以让代码正常工作

void main() {
  if (fb.apps.length == 0) {
    try {
      fb.initializeApp(
        apiKey: "mike",
        authDomain: "myauthdomain",
        databaseURL: "mydburl",
        projectId: "myproductid",
        storageBucket: "mystoragebucket",
      );
    } catch(e) {
      print(e);
    }
  }

  fs.Firestore store = fb.firestore();
  fs.CollectionReference ref = store.collection("MyCollection");
  ref.onSnapshot.listen((querySnapshot) {
    querySnapshot.docs.forEach((doc) {
      print(doc.data());  // this works!!
    });
  });
  runApp(MyApp());
}
但是,正如我前面提到的,让流生成器工作,所有的建议都建议我可以通过说

class MyList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new StreamBuilder(
      stream: fb.firestore().collection('MyCollection').snapshots(),
      ...
我在web上运行的包似乎与firestore集合引用中的snapshots方法或属性没有任何相似之处。有人能帮我澄清一下吗?

querySnapshot.docs属性返回一个列表,而stream属性需要一个流,其中流上的每个项目都是一个列表

我只在iOS/Android的FlightFire库中需要这个,但它应该是这样的:

body: new StreamBuilder(
  stream: Firestore.instance.collection("collection").snapshots(),
  builder: (context, snapshot) {
    ...
Stream<List<DocumentSnapshot>> getStream() async* {
  fb.firestore().collection("MyCollection").onSnapshot.listen((querySnapshot) {
    yield querySnapshot.docs;
  }
}
querySnapshot.docs属性返回一个列表,而流属性需要一个流,其中流中的每个项都是一个列表

我只在iOS/Android的FlightFire库中需要这个,但它应该是这样的:

body: new StreamBuilder(
  stream: Firestore.instance.collection("collection").snapshots(),
  builder: (context, snapshot) {
    ...
Stream<List<DocumentSnapshot>> getStream() async* {
  fb.firestore().collection("MyCollection").onSnapshot.listen((querySnapshot) {
    yield querySnapshot.docs;
  }
}

当我尝试创建一个使用大量StreamBuilder的Flitter移动应用程序的web版本时,我也遇到了同样的问题。以下是我的作品:

Pubspec.yaml依赖项:

  firebase_web: ^5.0.9
  firebase_core: ^0.4.3+2
在代码中:

import 'package:firebase_web/firestore.dart';
import 'package:firebase_web/firebase.dart';

body: new StreamBuilder(
  stream: firestore().collection('collection').onSnapshot,
  builder: (context, snapshot) {
...
下面我列出了一个列表,其中列出了迄今为止我在从Flitter移动应用程序到Flitter web应用程序的过程中遇到的变化:

文档=snapshot.data.docs.length中的文档 文档=firestore中的文档。集合'foo'。文档'bar' reference=snapshot.ref中的ref 数据=快照中的数据。数据 方法setData from Firestore=set 方法updateData from Firestore=updateData:{'yourKey':'yourValue',}
希望这能有所帮助

当我尝试创建一个使用大量StreamBuilder的Flitter移动应用程序的web版本时,我也遇到了同样的问题。以下是我的作品:

Pubspec.yaml依赖项:

  firebase_web: ^5.0.9
  firebase_core: ^0.4.3+2
在代码中:

import 'package:firebase_web/firestore.dart';
import 'package:firebase_web/firebase.dart';

body: new StreamBuilder(
  stream: firestore().collection('collection').onSnapshot,
  builder: (context, snapshot) {
...
下面我列出了一个列表,其中列出了迄今为止我在从Flitter移动应用程序到Flitter web应用程序的过程中遇到的变化:

文档=snapshot.data.docs.length中的文档 文档=firestore中的文档。集合'foo'。文档'bar' reference=snapshot.ref中的ref 数据=快照中的数据。数据 方法setData from Firestore=set 方法updateData from Firestore=updateData:{'yourKey':'yourValue',}
希望这能有所帮助

谢谢。你能想出我看到错误的原因吗:“收益率”不是一种类型。关于yield querySnapshot.docs;?六羟甲基三聚氰胺六甲醚。。。。我希望这对您有用,因为我在这里的一些测试中使用了它:这应该有用:Stream Stream=fb.firestore.collectionMyCollection.onSnapshot;等待流{yield*snapshot.docs;}中的最终快照,谢谢。你能想出我看到错误的原因吗:“收益率”不是一种类型。关于yield querySnapshot.docs;?六羟甲基三聚氰胺六甲醚。。。。我希望这对您有用,因为我在这里的一些测试中使用了它:这应该有用:Stream Stream=fb.firestore.collectionMyCollection.onSnapshot;等待流{yield*snapshot.docs;}中的最终快照。我实际上还没有尝试过这个方法,看看它是否有效,我可能不会尝试。在谷歌真正支持之前,我决定放弃Flitter。同时,让我们假设这是可行的,谢谢。@Lorence,我不能让你的方法起作用。。。我做错了什么?我知道如何在Firestore中正常使用,我不明白我需要做什么我想使用Streambuilder返回一个ListView.builder,它返回一个基于集合中文档快照的小部件列表…Hi@Chris如果我理解正确,你想要一个Streambuilder,它返回一个基于快照的小部件列表ListView.builder。我在github上举了一个例子。让我知道这是否接近你想要的嗨,洛伦斯,是的,这正是我想要做的。我理解这个结构,但流只是没有返回任何数据,或者如果是,它没有在小部件构建之前等待数据。。。所以我得到的是:有点不对劲。。无论我如何尝试查询,例如ifsnapshot.hasData{},或者我是否以集合或文档为目标…我实际上没有尝试此方法以查看它是否有效,我可能不会尝试。在谷歌真正支持之前,我决定放弃Flitter。同时,让我们假设这是可行的,谢谢。@Lorence,我不能让你的方法起作用。。。我做错了什么?我知道如何在Firestore中正常使用,我不知道我需要做什么
要使用Streambuilder返回一个ListView.builder,它返回一个基于集合中文档快照的小部件列表…您好@Chris如果我理解正确,您需要一个Streambuilder,它返回一个基于快照的小部件列表ListView.builder。我在github上举了一个例子。让我知道这是否接近你想要的嗨,洛伦斯,是的,这正是我想要做的。我理解这个结构,但流只是没有返回任何数据,或者如果是,它没有在小部件构建之前等待数据。。。所以我得到的是:有点不对劲。。无论我如何尝试查询,例如ifsnapshot.hasData{},或者我是否以集合或文档为目标。。。