【问题标题】:Get data from firebase using streambuilder使用 streambuilder 从 firebase 获取数据
【发布时间】:2019-05-10 04:45:13
【问题描述】:

我试图从 firebase 获取数据,但是当我在 initState 中对其进行初始化时,该函数不起作用。

我尝试给它调试打印,它没有显示在终端中,并且在我运行应用程序时没有错误或警告。

  void _getMarker() {
    StreamBuilder(
        stream: Firestore.instance
            .collection('contentislamis')
            .where('kategori', isEqualTo: 'Landmark')
            .snapshots(),
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return Center(
                child: CircularProgressIndicator(
                    valueColor: AlwaysStoppedAnimation<Color>(Colors.green)));
          } else {
            for (int i = 0; i < snapshot.data.documents.length; i++) {
                _addMarkers(snapshot.data.documents[i]);
                print("${snapshot.data.documents.length} markers added");
              }
          }
        });
  }

这是显示标记的功能

void _addMarkers(DocumentSnapshot markData) {
    final String markerIdVal = markData.documentID.toString();
    final MarkerId markerId = MarkerId(markerIdVal);

    double lat = double.tryParse(markData['posLat'].toString());
    double long = double.tryParse(markData['posLong'].toString());

    final Marker marker = Marker(
      markerId: markerId,
      position: LatLng(
        lat,
        long,
      ),
      infoWindow: InfoWindow(
        title: markData['judul'].toString(), 
        snippet: markData['posLat'] + markData['posLong']
      ),
      icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueRed) 
    );

    setState(() {
      markers[markerId] = marker;
    });
  }

【问题讨论】:

  • 你不必初始化流
  • 我该怎么办? @RubensMelo
  • 你试过看快照有没有错误?
  • 是的,我试过了,但没有发现错误@Hosar

标签: dart flutter


【解决方案1】:

你需要添加你想从firestore获取的数据的key 例如:

// title is the key in the firestore documents, you need to add your key here
addMarkers(snapshot.data.documents[i].data["title"])  

以下代码应该对您有所帮助,在本例中,我从云 Firestore 获取数据并将其显示在 Listview 中:

代码:

    @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Container(
        child: StreamBuilder<QuerySnapshot>(
          stream: Firestore.instance.collection("posts").snapshots(),
          builder:
              (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
            if (snapshot.hasError) {
              return new Text('Error: ${snapshot.error}');
            }
            if (snapshot.connectionState == ConnectionState.waiting) {
              return Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: <Widget>[
                    Text("Loading..."),
                    SizedBox(
                      height: 50.0,
                    ),
                    CircularProgressIndicator()
                  ],
                ),
              );
            } else {
              return ListView.builder(
                itemCount: snapshot.data.documents.length,
                itemBuilder: (_, index) {
                  return Card(
                      child: ListTile(
                          title: Text(
                              snapshot.data.documents[index].data["title"]),        // getting the data from firestore
                      ),
                   );
                },
              );
            }
          },
        ),
      ),
    );
  }

【讨论】:

  • 嗯,我已经在我的 addmarker 函数中添加了密钥,看看我的帖子,我已经编辑过了。我的问题是为什么 StreamBuilder 不能在 void 或函数中工作。在这种情况下,我想从 firebase 数据中显示我所有的谷歌地图标记
  • 你没有在 _getMarker() 函数中使用 StreamBuilder 尝试使用它。
  • @Rifky 尝试将 _getMarker() 函数数据类型作为 Widget 和 StreamBuilder Stream 因为 StreamBuilder 是一个 Widget 。例如: Widget _getMarker() { return StreamBuilder ( .... ) }
猜你喜欢
  • 2019-04-13
  • 2023-01-01
  • 2020-06-14
  • 2020-08-08
  • 2020-04-13
  • 2021-02-20
  • 2021-12-25
  • 2017-10-23
  • 1970-01-01
相关资源
最近更新 更多