【问题标题】:How to use Flutter (web app) stream builder with Firestore如何在 Firestore 中使用 Flutter(Web 应用)流构建器
【发布时间】:2020-03-27 09:14:00
【问题描述】:

我看到几个关于 Flutter for mobile 的问题和答案,它们使用如下流构建器:

body: new StreamBuilder(
  stream: Firestore.instance.collection("collection").snapshots(),
  builder: (context, snapshot) {
    ...

我正在尝试在 web 上的 Flutter 上做同样的事情,但在我的配置中,snapshots() 方法是未知的,在运行时会产生异常(并事先发出 vscode 警告)。为什么?我的设置不正确吗?

我已经按照我在这里和其他地方找到的这些步骤进行操作:

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

dependencies:
  flutter:
    sdk: flutter
  firebase: ^6.0.0

2) 在 index.html 正文标签中包含 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>

3) 在 main.dart 中,导入 firebase.dart 文件(使用给出的建议 here,尽管我不确定上面的哪个步骤让我可以访问这个包。如果不是的话,我是一个颤抖的 nube '不明显)

import 'package:flutter/material.dart';
import 'package:firebase/firebase.dart' as fb;
import 'package:firebase/firestore.dart' as fs;

按照这些步骤,我可以让这段代码工作......

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 方法(或属性)的东西。有人能直截了当吗?

【问题讨论】:

    标签: firebase flutter google-cloud-firestore flutter-web


    【解决方案1】:

    当我尝试创建一个使用大量 StreamBuilders 的 Flutter 移动应用程序的 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) {
    ...
    

    下面我列出了一个列表,其中包含到目前为止我从 Flutter 移动应用程序到 Flutter Web 应用程序时遇到的变化:

    • documents = docssnapshot.data.docs.length
    • documents() = doc()firestore().collection('foo').doc('bar')
    • reference = refsnapshot.ref
    • data = data()snapshot.data()
    • 来自 Firestore 的方法 setData = set
    • 来自 Firestore 的方法 updateData = update(data:{'yourKey': 'yourValue',})

    希望这能有所帮助!

    【讨论】:

    • 我还没有真正尝试过这个看看它是否有效,我可能不会尝试它。我决定放弃 www 的颤振,直到谷歌真正(真的)支持它。同时,让我们假设这是可行的,谢谢。
    • @Lorence,我无法让你的方法起作用......我做错了什么?我知道如何使用 Firestore 进行常规颤动,但我不明白我需要做什么
    • 我想使用 Streambuilder 返回一个 ListView.builder,它根据集合中文档的快照返回一个小部件列表...
    • 嗨@Chris,如果我理解正确,您想要一个返回 ListView.builder 的流构建器,它根据快照返回小部件。我在github上放了一个例子Check the code out here。让我知道这是否接近您正在寻找的内容
    • 嗨 Lorence,是的,这正是我想要做的。我了解结构,但流只是没有返回任何数据,或者如果它没有在构建小部件之前等待该数据......所以我得到的是:“出了点问题”......无论如何我尝试查询,例如if(snapshot.hasData){} 或者我是否针对集合或文档...
    【解决方案2】:

    querySnapshot.docs 属性返回List&lt;DocumentSnapshot&gt;,而stream 属性需要stream,其中流中的每个项目都是一个列表。

    我只需要使用适用于 iOS/Android 的 FlutterFire 库,但它应该看起来像这样:

    Stream<List<DocumentSnapshot>> getStream() async* {
      fb.firestore().collection("MyCollection").onSnapshot.listen((querySnapshot) {
        yield querySnapshot.docs;
      }
    }
    

    【讨论】:

    • 谢谢。您能想出我看到“错误:'yield' 不是类型”的原因吗?在yield querySnapshot.docs();?
    • 嗯....我希望这对你有用,因为我在我自己的一些测试中使用它:stackoverflow.com/a/59097364/209103
    • 这应该可以工作: Stream<...> stream = fb.firestore().collection("MyCollection").onSnapshot;等待(流中的最终快照){ yield* snapshot.docs; } }
    猜你喜欢
    • 2019-12-18
    • 2019-12-01
    • 2020-08-12
    • 2020-05-01
    • 2019-07-31
    • 2020-03-12
    • 2020-11-26
    • 2020-09-21
    • 2021-09-07
    相关资源
    最近更新 更多