Android 在Flatter中显示Firestore数据中的卡

Android 在Flatter中显示Firestore数据中的卡,android,firebase,flutter,google-cloud-firestore,Android,Firebase,Flutter,Google Cloud Firestore,我最近尝试制作一个Flutter应用程序,它从google cloud Firestore获取数据流,并在新屏幕上以卡片的形式显示给用户。我偶然发现了这个网站,并紧跟着这个例子从流数据中创建了一个列表视图,并且能够用不太多的努力来实现它。下面是它的样子 已成功实施具有列表视图的颤振应用程序: 但问题是,当我尝试将输出转换为卡片而不是简单的列表视图时,会收到一条警告,说我的小部件溢出了。看看下面 卡溢出警告: 我试图将整个小部件放在一个受约束的框中,还试图使包覆面提取属性为true,但似乎没有

我最近尝试制作一个Flutter应用程序,它从google cloud Firestore获取数据流,并在新屏幕上以卡片的形式显示给用户。我偶然发现了这个网站,并紧跟着这个例子从流数据中创建了一个列表视图,并且能够用不太多的努力来实现它。下面是它的样子

已成功实施具有列表视图的颤振应用程序:

但问题是,当我尝试将输出转换为卡片而不是简单的列表视图时,会收到一条警告,说我的小部件溢出了。看看下面

卡溢出警告:

我试图将整个小部件放在一个受约束的框中,还试图使包覆面提取属性为true,但似乎没有任何帮助。如果有人能帮我找出哪里错了,给我指出正确的方向,我会非常高兴。 下面是我为使用Firestore实现streamBuilder类中的卡片布局而编写的全部代码

PS:卡布局和列表视图布局由应用程序右上角的图形图标显示[图片中未显示]

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

void main() => runApp(FireList());

class FireList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Firebase Listview',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyListView(),
    );
  }
}

class MyListView extends StatefulWidget {
  @override
  _MyListViewState createState() => _MyListViewState();
}

class _MyListViewState extends State<MyListView> {
  int _upCounter = 0;
  int _downCounter = 0;
  var _newdata;
  var myDatabase = Firestore.instance;

  void _putdata() {
    var myDatabase = Firestore.instance;
    myDatabase.collection('newDoc1').document("outsideData$_upCounter").setData(
      {
        "data": "Uploaded outsider data $_upCounter",
      },
    );
    _upCounter++;
  }

  @override
  Widget build(BuildContext context) {
    _putdata();
    return Scaffold(
      appBar: AppBar(
        title: Text('Firebse Listview'),
        actions: <Widget>[
          IconButton(
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => MyList()),
              );
            },
            icon: Icon(Icons.multiline_chart),
          )
        ],
      ),
      // body: Center(
      //   child: Text(
      //       "Cloud Firestore contains this sentence:\nFetch Attemp: $_downCounter\nData: $_datafromfirestore"),
      // ),
      body: StreamBuilder(
        stream: myDatabase.collection('newDoc1').snapshots(),
        builder: (context, snapshot) {
          if (snapshot.hasError) {
            Center(
              child: Text("\nCaught an error in the firebase thingie... :| "),
            );
          }
          if (!snapshot.hasData) {
            return Center(
              child: Text("\nHang On, We are building your app !"),
            );
          } else {
            var mydata = snapshot.data;
            print(mydata);
            _newdata = mydata.documents[_downCounter]["data"];
            return Center(
              child: Text(
                  "Cloud Firestore contains this sentence:\nFetch Attempt: $_downCounter\nData: $_newdata"),
            );
          }
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            _downCounter++;
          });
        },
        child: Icon(Icons.cloud_download),
        tooltip: 'Download Data',
      ),
    );
  }
}

class MyList extends StatefulWidget {
  @override
  _MyListState createState() => _MyListState();
}

class _MyListState extends State<MyList> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("ListView Firestore"),
      ),
      body: StreamBuilder<QuerySnapshot>(
        stream: Firestore.instance.collection("newDoc1").snapshots(),
        builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
          if (snapshot.hasError) return new Text('${snapshot.error}');
          switch (snapshot.connectionState) {
            case ConnectionState.waiting:
              return new Center(child: new CircularProgressIndicator());
            default:
              // return ListView(
              //   padding: EdgeInsets.fromLTRB(10, 20, 10, 30),
              //   children:
              //       snapshot.data.documents.map((DocumentSnapshot document) {
              //     return new ListTile(
              //       title: new Text(document['data']),
              //     );
              //   }).toList(),
              // );
              return Card(
                child: Column(
                  children: <Widget>[
                    ListView(
                      shrinkWrap: true,
                      children: snapshot.data.documents.map(
                        (DocumentSnapshot document) {
                          return new ListTile(
                            title: new Text(document['data']),
                          );
                        },
                      ).toList(),
                    ),
                  ],
                ),
              );
          }
        },
      ),
    );
  }
}
下面是我的cloud Firestore文档的外观:


我想你想在一张卡片上显示你所有的数据,对吗

我编辑了你的代码这一个应该适合你:

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

void main() => runApp(FireList());

class FireList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Firebase Listview',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyListView(),
    );
  }
}

class MyListView extends StatefulWidget {
  @override
  _MyListViewState createState() => _MyListViewState();
}

class _MyListViewState extends State<MyListView> {
  int _upCounter = 0;
  int _downCounter = 0;
  var _newdata;
  var myDatabase = Firestore.instance;

  void _putdata() {
    var myDatabase = Firestore.instance;
    myDatabase.collection('newDoc1').document("outsideData$_upCounter").setData(
      {
        "data": "Uploaded outsider data $_upCounter",
      },
    );
    _upCounter++;
  }

  @override
  Widget build(BuildContext context) {
    _putdata();
    return Scaffold(
      appBar: AppBar(
        title: Text('Firebse Listview'),
        actions: <Widget>[
          IconButton(
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => MyList()),
              );
            },
            icon: Icon(Icons.multiline_chart),
          )
        ],
      ),
      // body: Center(
      //   child: Text(
      //       "Cloud Firestore contains this sentence:\nFetch Attemp: $_downCounter\nData: $_datafromfirestore"),
      // ),
      body: StreamBuilder(
        stream: myDatabase.collection('newDoc1').snapshots(),
        builder: (context, snapshot) {
          if (snapshot.hasError) {
            Center(
              child: Text("\nCaught an error in the firebase thingie... :| "),
            );
          }
          if (!snapshot.hasData) {
            return Center(
              child: Text("\nHang On, We are building your app !"),
            );
          } else {
            var mydata = snapshot.data;
            print(mydata);
            _newdata = mydata.documents[_downCounter]["data"];
            return Center(
              child: Text(
                  "Cloud Firestore contains this sentence:\nFetch Attempt: $_downCounter\nData: $_newdata"),
            );
          }
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            _downCounter++;
          });
        },
        child: Icon(Icons.cloud_download),
        tooltip: 'Download Data',
      ),
    );
  }
}

class MyList extends StatefulWidget {
  @override
  _MyListState createState() => _MyListState();
}

class _MyListState extends State<MyList> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("ListView Firestore"),
      ),
      body: StreamBuilder<QuerySnapshot>(
        stream: Firestore.instance.collection("newDoc1").snapshots(),
        builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
          if (snapshot.hasError) return new Text('${snapshot.error}');
          switch (snapshot.connectionState) {
            case ConnectionState.none:
            case ConnectionState.waiting:
              return Center(
                child: CircularProgressIndicator(),
              );
            case ConnectionState.active:
            case ConnectionState.done:
              if (snapshot.hasError)
                return Center(child: Text('Error: ${snapshot.error}'));
              if (!snapshot.hasData) return Text('No data finded!');
              return Card(
                child: SingleChildScrollView(
                  child: Column(
                    children:
                      snapshot.data.documents.map((DocumentSnapshot document){
                        return new Text(document['data']);
                      }).toList()
                  ),
                ),
              );
          }
        },
      ),
    );
  }
}
您也可以使用ListView来实现此解决方案,但我认为这要简单得多