如何在Flutter中显示Firestore DocumentReference的数据

时间:2020-02-25 10:21:13

标签: flutter google-cloud-firestore

我的firestore数据库中有两个集合,它的结构是

Collection1 - movies
   -movieTitle : String
   -movieYear : String
   -movieDirector : DocumentReference
   .
   .
   etc

Collection2 - directors
   -dirName: String
   -dirImage: String
   .
   .
   etc

我想在movieTitle中显示dirNameListTile

这是我尝试这样做的方式

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

class TestPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _TestPageState();
  }
}

class _TestPageState extends State<TestPage> {
  DocumentSnapshot document;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: StreamBuilder<QuerySnapshot>(
        stream: Firestore.instance.collection('movies').snapshots(),
        builder:
            (BuildContext context, AsyncSnapshot<QuerySnapshot> movieSnapshot) {
          if (!movieSnapshot.hasData) return const Text('Loading...');
          final int messageCount = movieSnapshot.data.documents.length;
          return ListView.builder(
            itemCount: messageCount,
            itemBuilder: (_, int index) {
              document = movieSnapshot.data.documents[index];
              return ListTile(
                title: Text(document['movieTitle'] ?? 'title not retrieved'),
                subtitle: Text(getValue(document["movieDirector"]) ??
                    'director not retrieved'),
              );
            },
          );
        },
      ),
    );
  }

  String getValue(DocumentReference documentReference) {
    String val;
    documentReference.get().then((onData) {
        val = onData.data["directorName"];
        print(val);
      });
    return val;
  }
}

最后,我无法在屏幕上获取该值。我应该在实施中进行哪些更改?

1 个答案:

答案 0 :(得分:0)

您需要了解Future和async / await,以便可以轻松编写此类代码。

这里的问题是getValue必须立即返回,但是它要求的directorName在将来的某个时候到达。因此,您根本无法立即获得它。

FutureBuilder赋予subtitle:是您可以采取的选择之一。

此外,您应该考虑缓存stream(如果将来按照我的建议实施,则应该缓存),这样就不会发出不需要的请求。在这里,我尝试在我的演示文稿中进行解释:https://youtu.be/0gBsHLgCY6M?list=PL0bBHyAilexzBdvHookPcPZNMceciAaZf&t=1900