Как отобразить данные пожарного магазина DocumentReference во флаттере - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть две коллекции в моей базе данных пожарного магазина, и это структура, как,

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

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

Я хочу отобразить movieTitle и dirName в ListTile.

Вот как я пытался это сделать,

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 голосов
/ 25 февраля 2020

Вам нужно узнать о Futures и async / await, чтобы вы могли удобно писать такой код.

Проблема в том, что getValue должен немедленно вернуться, но directorName, который он запрашивает, прибывает когда-нибудь в будущем. Поэтому вы просто не можете получить это прямо сейчас.

Предоставление FutureBuilder на subtitle: является одним из вариантов, который вы можете использовать.

Также вы должны рассмотреть возможность кэширования stream (и будущего, если вы реализуете его согласно моему предложению выше), чтобы вы не делали нежелательных запросов. Прямо здесь я пытаюсь объяснить это в моей презентации: https://youtu.be/0gBsHLgCY6M?list=PL0bBHyAilexzBdvHookPcPZNMceciAaZf&t=1900

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...