【问题标题】:How to display data of firestore DocumentReference in flutter如何在颤动中显示firestore DocumentReference的数据
【发布时间】:2020-02-25 10:21:13
【问题描述】:

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

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

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

我想在ListTile 中显示movieTitledirName

我是如何尝试这样做的,

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

最后我无法获得屏幕上的值。我应该在我的实施中改变什么?

【问题讨论】:

    标签: flutter google-cloud-firestore


    【解决方案1】:

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

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

    subtitle: 提供FutureBuilder 是您可以追求的选择之一。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-31
      • 2018-05-16
      • 2021-03-19
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多