【问题标题】:Firestore async load and populate listview flutterFirestore 异步加载和填充列表视图颤动
【发布时间】:2018-09-22 09:04:31
【问题描述】:

您好,我正在尝试从 firestore 获取数据并填充 listview,以下是我的代码,但由于我的异步调用未完成,我遇到了异常,如何等待异步调用完成并填充我的 listview 我的代码如下:

    import 'dart:async';

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:test_flutter/pkg/Feed.dart';

class FeedLoader {
  final CollectionReference _colReference;

  FeedLoader(Firestore _firestore)
      : _colReference = _firestore.collection(Feed.getDocumentName()) {}

  Future<List<Feed>> load() async {
    final List<Feed> feeds = new List<Feed>();
    await for (QuerySnapshot qs in _colReference.snapshots) {
      for (DocumentSnapshot ds in qs.documents) {
        feeds.add(Feed.fromJson(ds.data));
      }
      return feeds;
    }
    return feeds;
  }
}

这是我的小工具

    import 'package:flutter/material.dart';
import 'package:test_flutter/pkg/FeedLoader.dart';
import 'package:test_flutter/pkg/Feed.dart';

class FeedWidget extends StatefulWidget {
  final FeedLoader feedLoader;

  const FeedWidget({Key key, this.feedLoader}) : super(key: key);

  createState() => new FeedWidgetState(feedLoader);
}

class FeedWidgetState extends State<FeedWidget> {
  final List<Feed> _feeds = new List<Feed>();
  final FeedLoader _feedLoader;
  final TextStyle fontStyle = const TextStyle(fontSize: 16.0);

  FeedWidgetState(this._feedLoader);

  @override
  Widget build(BuildContext context) {
    print(_feedLoader == null);
    _feedLoader
        .load()
        .then((feeds) => () {
              print("Got call back now");
              _feeds.addAll(feeds);
            })
        .catchError((e) => handleError(e));

    print("Feeds size ${_feeds}");
    return _buildListView(context);
  }

  void handleError(e) {
    print("FeedLoaderException ${e}");
  }

  Widget _buildListView(BuildContext context) {
    return new ListView.builder(
      padding: const EdgeInsets.all(6.0),
      itemBuilder: (context, i) {
        if (i.isOdd) return new Divider();

        final index = i ~/ 2;
//        pagination
//        if (index >= contents.length) {
//          contents.addAll(generateWordPairs().take(10));
//        }
        return _buildRowContent(context, _feeds[i]);
      },
    );
  }

  Widget _buildRowContent(BuildContext context, Feed content) {
    return new ListTile(
      title: new Text(
        "${content.getTitle()}",
        style: fontStyle,
      ),
    );
  }
}

【问题讨论】:

    标签: firebase dart google-cloud-firestore flutter


    【解决方案1】:

    您可以使用StreamBuilderFutureBuilder 异步构建小部件

    例如你可以这样做

    return new StreamBuilder(
       stream: Firestore....snapshot,
       builder: (context, snapshot) {
          if (snapshot.hasData) {
             final feeds = snapshot.data.map(Feed.fromJson);
             return new ListView(
                  ....
             );
          }
       },
    )
    

    【讨论】:

    • 它可以工作,但我无法显示数据,因为snapshot.hasData 首先是假的,然后我返回空容器,但当它有数据时它不会替换,我知道这是一个单独的问题,你能帮忙吗
    • 如果 firestore 请求是针对单个文档的,FutureBuilder 是否更可取,因为不需要流?
    • Stream 与多文档无关。这是关于文档更新的。 FirebaseDatabase 和 Firestore SDK 都允许实时读取;在 dart 中转化为流
    猜你喜欢
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    相关资源
    最近更新 更多