Flutter / Firebase-类型'Future <int>'不是类型'int'的子类型

时间:2020-09-06 15:56:33

标签: firebase flutter dart google-cloud-firestore

我是新手,这可能是一个简单的问题,但我正在寻找一些解释,以帮助我更多地了解期货和未来建筑商。我正在尝试查询Firebase(取决于用户在上一个屏幕上单击的内容),并且我想等待所有数据加载后再显示任何内容。为此,我认为未来的构建者将是最合适的,因为我将展示一些不会带来很大变化的产品。我创建了我的getData函数:

  Future getCardData() async {
    return await Firestore.instance.collection('cards')
        .where('Event', isEqualTo: widget.documentid).snapshots();
    }
  }

并在此处实现它:

  body: FutureBuilder(
    future: getCardData(),
    builder: (context, snapshot) {
      if (!snapshot.hasData) {
        return Center(child: const Text('Loading...'));
      }
      return GridView.builder(
        shrinkWrap: true,
        gridDelegate:
        SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
        itemCount: snapshot.data.length,
        itemBuilder:
            (BuildContext context, int index) {
          print(snapshot.data.documents[index].data['img_url']);
          return Padding(
            padding: const EdgeInsets.all(8.0),
            child: Container(
              height: MediaQuery.of(context).size.height / 6,
              child: Center(
                  child: Card(
                    elevation: 8.0,
                    child: Image(
                      image: FirebaseImage(snapshot.data.documents[index].data['img_url']),
                    ),
                  )
              ),
            ),
          );
        },
      );
    },
  ),

但是我(由于我假设是GridView.buider的itemCount部分)收到一条错误消息:

type 'Future<int>' is not a subtype of type 'int'

我想知道如何访问此将来值,然后调整代码的其余部分以等待数据加载,然后再显示任何图像。

1 个答案:

答案 0 :(得分:1)

snapshots()返回一个Stream,因此将其更改为getDocuments()

Future<QuerySnapshot> getCardData() async {
  return await Firestore.instance.collection('cards')
    .where('Event', isEqualTo: widget.documentid).getDocuments();
}

然后在itemCount中,您可以执行以下操作:

itemCount: snapshot.data.documents.length,