如何在flutter中从firebase获取数据

Posted

技术标签:

【中文标题】如何在flutter中从firebase获取数据【英文标题】:how to get data from firebase in flutter 【发布时间】:2019-02-07 08:43:39 【问题描述】:

我正在构建一个颤振应用程序并使用 cloud-firestore, 这就是我的数据库的样子

我想要一个函数,它可以在字符串数组中检索名为“驱动程序列表”的集合中的所有文档 那是我已经使用过的,但它会让它们回到新屏幕的列表视图中

class DriverList extends StatelessWidget @overrideWidget build(BuildContext context) 
return new StreamBuilder<QuerySnapshot>(
  stream: Firestore.instance.collection('DriverList').snapshots(),
  builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) 
    if (!snapshot.hasData) return new Text('Loading...');
    return new ListView(
      children: snapshot.data.documents.map((DocumentSnapshot document) 
        return new ListTile(
          title: new Text(document['name']),
          subtitle: new Text(document['phone']),
        );
      ).toList(),
    );
  ,
);

【问题讨论】:

firebase.google.com/docs/flutter/setup 谢谢我得到了这个链接和其他链接,但它们都只是展示了如何在新屏幕的 ListView 中检索数据,我的问题是如何将它们放入字符串数组中? 目前还不清楚您在实现此要求的过程中遇到的问题。请更新您的问题以显示您已经尝试过的内容。 是关于如何从 firstore 中检索数据或如何在代码中构造检索到的数据的问题 问题已更新,它是关于检索不在列表视图中的字符串数组中的数据 【参考方案1】:

这有一些额外的逻辑来删除可能重复的记录,但您可以使用类似以下内容从 Firestore 检索数据。

我们可以访问一个集合引用,然后列出查询结果,然后为 Firestore 返回的数据创建本地模型对象,然后我们返回这些模型对象的列表。

  static Future<List<AustinFeedsMeEvent>> _getEventsFromFirestore() async 
CollectionReference ref = Firestore.instance.collection('events');
QuerySnapshot eventsQuery = await ref
    .where("time", isGreaterThan: new DateTime.now().millisecondsSinceEpoch)
    .where("food", isEqualTo: true)
    .getDocuments();

HashMap<String, AustinFeedsMeEvent> eventsHashMap = new HashMap<String, AustinFeedsMeEvent>();

eventsQuery.documents.forEach((document) 
  eventsHashMap.putIfAbsent(document['id'], () => new AustinFeedsMeEvent(
      name: document['name'],
      time: document['time'],
      description: document['description'],
      url: document['event_url'],
      photoUrl: _getEventPhotoUrl(document['group']),
      latLng: _getLatLng(document)));
);

return eventsHashMap.values.toList();

来源:https://github.com/dazza5000/austin-feeds-me-flutter/blob/master/lib/data/events_repository.dart#L33

【讨论】:

【参考方案2】:
    import 'package:cloud_firestore/cloud_firestore.dart';
    import 'package:flutter/material.dart';

    class LoadDataFromFirestore extends StatefulWidget 
      @override
      _LoadDataFromFirestoreState createState() => _LoadDataFromFirestoreState();
    

    class _LoadDataFromFirestoreState extends State<LoadDataFromFirestore> 
      @override
      void initState() 
        super.initState();
        getDriversList().then((results) 
          setState(() 
            querySnapshot = results;
          );
        );
      

      QuerySnapshot querySnapshot;
      @override
      Widget build(BuildContext context) 
        return Scaffold(
          body: _showDrivers(),
        );
      

    //build widget as prefered
    //i'll be using a listview.builder
      Widget _showDrivers() 
        //check if querysnapshot is null
        if (querySnapshot != null) 
          return ListView.builder(
            primary: false,
            itemCount: querySnapshot.documents.length,
            padding: EdgeInsets.all(12),
            itemBuilder: (context, i) 
              return Column(
                children: <Widget>[
//load data into widgets
                  Text("$querySnapshot.documents[i].data['activation']"),
                  Text("$querySnapshot.documents[i].data['car1']"),
                  Text("$querySnapshot.documents[i].data['car2']"),
                  Text("$querySnapshot.documents[i].data['car5']"),
                  Text("$querySnapshot.documents[i].data['name']"),
                  Text("$querySnapshot.documents[i].data['phone']"),
                ],
              );
            ,
          );
         else 
          return Center(
            child: CircularProgressIndicator(),
          );
        
      

      //get firestore instance
      getDriversList() async 
        return await Firestore.instance.collection('DriversList').getDocuments();
      
    

【讨论】:

【参考方案3】:

获取一次性数据:

var collection = FirebaseFirestore.instance.collection('DriverList');
var querySnapshot = await collection.get();
for (var queryDocumentSnapshot in querySnapshot.docs) 
  Map<String, dynamic> data = queryDocumentSnapshot.data();
  var name = data['name'];
  var phone = data['phone'];

每次更改时获取数据,使用StreamBuilder

StreamBuilder<QuerySnapshot<Map<String, dynamic>>>(
  stream: FirebaseFirestore.instance.collection('DriverList').snapshots(),
  builder: (_, snapshot) 
    if (snapshot.hasError) return Text('Error = $snapshot.error');

    if (snapshot.hasData) 
      final docs = snapshot.data!.docs;
      return ListView.builder(
        itemCount: docs.length,
        itemBuilder: (_, i) 
          final data = docs[i].data();
          return ListTile(
            title: Text(data['name']),
            subtitle: Text(data['phone']),
          );
        ,
      );
    

    return Center(child: CircularProgressIndicator());
  ,
)

【讨论】:

以上是关于如何在flutter中从firebase获取数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在flutter中从firebase数据填充listview

如何在 Flutter 中从 Firebase Auth 获取用户 ID?

如何在 Flutter 中从 Firebase 获取当前用户 ID

在 Flutter 的下拉列表中从 Firebase 获取经过身份验证的用户列表

在 Flutter 中从 Firebase FireCloud 接收数据时,StreamBuilder 中的快照代码不会被执行

如何在 Flutter 中从 firebase 存储读取和写入文本文件?