【问题标题】:flutter firebase get string from database using futureflutter firebase使用future从数据库中获取字符串
【发布时间】:2021-08-25 20:12:04
【问题描述】:

我想从我在 Firebase 中的数据库中获取一个字符串,我很困惑,我不知道该怎么做!

过去几天我对这个想法进行了大量搜索,但没有得到任何有用的结果

我想要什么?我想做一个返回“问题”字符串的方法。 DB:收藏/历史/问题

感谢您的宝贵时间

不正确的代码:

Future loadData() async {

await Firebase.initializeApp();
if (snapshot.hasError) {
            return Scaffold(
              body: Center(
                child: Text("Error: ${snapshot.error}"),
              ),
            );
          }

          // Collection Data ready to display
          if (snapshot.connectionState == ConnectionState.done) {
            // Display the data inside a list view
            return snapshot.data.docs.map(
              (document) {
                return method(
                  document.data()['question'].toString().toString(),
                ); //Center(

                  
              },
            );
          }

}

【问题讨论】:

  • 好的,您使用哪个数据库? Cloud firestore 还是 Realtime?
  • 它只是云火库,因为测验问题存储在数据库中,使用实时数据加载并不重要
  • 好的,请给我几秒钟。
  • 没关系,慢慢来,我也在考虑解决方案

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:

这是来自 Flutter Fire 的官方文档 - https://firebase.flutter.dev/docs/firestore/usage/


从 Cloud Firestore 读取数据

Cloud Firestore 让您能够读取集合或文档的值。这可以是一次性读取,也可以在查询中的数据发生更改时由实时更新提供。

一次性阅读

要读取一次集合或文档,请调用Query.get 或 DocumentReference.get 方法。在下面的示例中,FutureBuilder 用于帮助管理请求的状态:

class GetUserName extends StatelessWidget {
  final String documentId;

  GetUserName(this.documentId);

  @override
  Widget build(BuildContext context) {
    CollectionReference users = FirebaseFirestore.instance.collection('users');

    return FutureBuilder<DocumentSnapshot>(
      future: users.doc(documentId).get(),
      builder:
          (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {

        if (snapshot.hasError) {
          return Text("Something went wrong");
        }

        if (snapshot.hasData && !snapshot.data.exists) {
          return Text("Document does not exist");
        }

        if (snapshot.connectionState == ConnectionState.done) {
          Map<String, dynamic> data = snapshot.data.data();
          return Text("Full Name: ${data['full_name']} ${data['last_name']}");
        }

        return Text("loading");
      },
    );
  }
}

要了解有关离线读取数据的更多信息,请查看 Access Data Offline 文档。

实时变化

FlutterFire 支持处理集合和文档的实时更改。在初始请求中提供一个新事件,并且在发生更改(修改、删除或添加)时对集合/文档进行任何后续更改。

CollectionReferenceDocumentReference 都提供了一个返回 Stream 的 snapshots() 方法:

Stream collectionStream = FirebaseFirestore.instance.collection('users').snapshots();
Stream documentStream = FirebaseFirestore.instance.collection('users').doc('ABC123').snapshots();

返回后,您可以通过 listen() 方法订阅更新。下面的示例使用 StreamBuilder 来帮助自动管理流状态并在您的应用中不再使用流时对其进行处置:

class UserInformation extends StatefulWidget {
  @override
    _UserInformationState createState() => _UserInformationState();
}

class _UserInformationState extends State<UserInformation> {
  final Stream<QuerySnapshot> _usersStream = FirebaseFirestore.instance.collection('users').snapshots();

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: _usersStream,
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (snapshot.hasError) {
          return Text('Something went wrong');
        }

        if (snapshot.connectionState == ConnectionState.waiting) {
          return Text("Loading");
        }

        return new ListView(
          children: snapshot.data.docs.map((DocumentSnapshot document) {
            return new ListTile(
              title: new Text(document.data()['full_name']),
              subtitle: new Text(document.data()['company']),
            );
          }).toList(),
        );
      },
    );
  }
}

默认情况下,如果发生仅影响元数据的更改,侦听器不会更新。如果您想在文档或查询元数据发生更改时接收事件,可以将 includeMetadataChanges 传递给 snapshots 方法:

FirebaseFirestore.instance
  .collection('users')
  .snapshots(includeMetadataChanges: true)

【讨论】:

  • 感谢您的回答,我有一个问题,在您的示例中,您使用 FutureBuilder&lt;DocumentSnapshot&gt; 作为小部件...如何使用 future 作为函数返回字符串值?
  • 使用流!等等我这里举个例子
  • Cloud firestore 的工作方式类似于自定义模型类,因此您无法直接从那里获取字符串,也许您可​​以将其用作 REST-API。好的答案是:你必须创建一个Stream collectionStream = FirebaseFirestore.instance.collection('users').snapshots(); 对吗?然后你有 Future builder 或 Stream builder,所以通过使用 flutter fire 包你不能直接赋值,你必须使用 Future 或 Stream builder。
  • 正如我所提到的,为您的集合创建一个 Stream 并使用 Stream 或未来构建器包装您的 Text 小部件,然后将快照的值放入您的文本 val。
  • 这篇文章将帮助您了解更多关于 Firebase/Cloud medium.com/firebase-tips-tricks/…
猜你喜欢
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 2019-04-13
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
相关资源
最近更新 更多