firebase - 预期为 'Map<String, dynamic>' 类型的值,但得到了 'Null' 类型的值

标签 firebase flutter dart google-cloud-firestore flutter-web

我正在使用 flutter 并通过 cloud_firestore 管理数据。 我可以将数据发送到 firestore,但现在我在读取数据方面遇到了困难。

在firestore中,数据是这样存储的;

"users" collection -> "(uid)" document -> "userName" string field

这是我尝试的代码。 显示 LinerProgressIndicator 直到快照完成。

  CollectionReference users = FirebaseFirestore.instance.collection('users');

FutureBuilder(
              future: users.doc().get(),
              builder: (context, AsyncSnapshot<DocumentSnapshot> snapshot) {
                if (snapshot.connectionState != ConnectionState.done) {
                  return const SizedBox(
                    width: 50,
                    child: LinearProgressIndicator(),
                  );
                }

                if (snapshot.hasError) {
                  return SelectableText(snapshot.error.toString());
                }

                if (!snapshot.hasData) {
                  return const Text('No data found');
                }

                Map<String, dynamic> data =
                    snapshot.data!.data() as Map<String, dynamic>;
                return Text("User Name: ${data['userName']}");
              },
            )

但是当快照完成时,发生错误。

Expected a value of type 'Map<String, dynamic>', but got one of type 'Null'

Img1


我引用了一次性阅读项目 this official article

我已确认“users”-> uid ->“userName”的值是正确的。

Img2

添加 1:

我调试了 FutureBuilderbuilder

print('${snapshot.data!.data()}');

null

print('${snapshot.data}');

Instance of '_JsonDocumentSnapshot'

添加 2:

@赛夫伊斯兰

我重写了代码。 然后出现其他错误。

Expected a value of type 'Map<String, dynamic>', but got one of type '_JsonDocumentSnapshot'

此外,print() 结果与添加 1 相同。

测试代码;

    CollectionReference users = FirebaseFirestore.instance.collection('users');

    FutureBuilder(
      future: users.doc(FirebaseAuth.instance.currentUser!.uid).get(),
      builder: (context, AsyncSnapshot<DocumentSnapshot> snapshot) {

        print('${snapshot.data!.data()}');  //null
        print('${snapshot.data}');    //Instance of '_JsonDocumentSnapshot'


        if (snapshot.connectionState != ConnectionState.done) {
          return const SizedBox(
            width: 50,
            child: LinearProgressIndicator(),
          );
        }

        if (snapshot.hasError) {
          return SelectableText(snapshot.error.toString());
        }

        if (!snapshot.hasData) {
          return const Text('No data found');
        }

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

        return const SelectableText("userName");
      },
    )

添加 3:##

添加了print('${jsonDecode(snapshot.data)}')

错误再次出现。

Bad state: cannot get a field on a DocumentSnapshotPlatform which does not exist

错误的详细信息;

Launching lib\main.dart on Chrome in debug mode...
This app is linked to the debug service: ws://127.0.0.1:59027/fBobSNPxOzo%3D/ws
Debug service listening on ws://127.0.0.1:59027/fBobSNPxOzo=/ws
 Running with sound null safety
Connecting to VM Service at ws://127.0.0.1:59027/fBobSNPxOzo=/ws

════════ Exception caught by widgets library ═══════════════════════════════════
The following StateError was thrown building FutureBuilder<DocumentSnapshot<Object?>>(dirty, state: _FutureBuilderState<DocumentSnapshot<Object?>>#330c8):
Bad state: cannot get a field on a DocumentSnapshotPlatform which does not exist

The relevant error-causing widget was
FutureBuilder<DocumentSnapshot<Object?>> FutureBuilder:file:///D:/FlutterProjects/testProject/lib/profile.dart:32:13
When the exception was thrown, this was the stack
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 251:49  throw_
packages/cloud_firestore_platform_interface/src/platform_interface/platform_interface_document_snapshot.dart 77:7          get
packages/cloud_firestore/src/document_snapshot.dart 92:48                                                                  get
packages/cloud_firestore/src/document_snapshot.dart 96:40                                                                  _get
packages/testProject/profile.dart 50:45                                                                                      <fn>
packages/flutter/src/widgets/async.dart 782:48                                                                             build
packages/flutter/src/widgets/framework.dart 4782:27                                                                        build
packages/flutter/src/widgets/framework.dart 4665:15                                                                        performRebuild
packages/flutter/src/widgets/framework.dart 4840:11                                                                        performRebuild
packages/flutter/src/widgets/framework.dart 4355:5                                                                         rebuild
packages/flutter/src/widgets/framework.dart 2620:31                                                                        buildScope
packages/flutter/src/widgets/binding.dart 882:9                                                                            drawFrame
packages/flutter/src/rendering/binding.dart 319:5                                                                          [_handlePersistentFrameCallback]
packages/flutter/src/scheduler/binding.dart 1143:15                                                                        [_invokeFrameCallback]
packages/flutter/src/scheduler/binding.dart 1080:9                                                                         handleDrawFrame
packages/flutter/src/scheduler/binding.dart 996:5                                                                          [_handleDrawFrame]
C:/b/s/w/ir/cache/builder/src/out/host_debug/flutter_web_sdk/lib/_engine/engine/platform_dispatcher.dart 1003:13           invoke
C:/b/s/w/ir/cache/builder/src/out/host_debug/flutter_web_sdk/lib/_engine/engine/platform_dispatcher.dart 157:5             invokeOnDrawFrame
C:/b/s/w/ir/cache/builder/src/out/host_debug/flutter_web_sdk/lib/_engine/engine.dart 440:45                                <fn>
════════════════════════════════════════════════════════════════════════════════

════════ Exception caught by rendering library ═════════════════════════════════
A RenderFlex overflowed by 99340 pixels on the bottom.
The relevant error-causing widget was
Column Column:file:///D:/FlutterProjects/testProject/lib/profile.dart:26:20
════════════════════════════════════════════════════════════════════════════════

你能想到什么样的问题?

谢谢。

最佳答案

您应该只返回存在的文档的Map。但是,您并没有检查这个条件是否成立。 为了安全起见,除非数据位于 if 语句内,否则不要返回数据,该语句会检查 hasData,然后存在

该错误也可能是由于拼写错误造成的。再次仔细检查。

但是你的错误从一开始就是这样的:

  future: users.doc().get(),

你没有说出哪个文件。运行此查询时,您需要传递文档的 id

 future: users.doc('0Cb43453fdsg4').get(), //This is an example 'id'.

关于firebase - 预期为 'Map<String, dynamic>' 类型的值,但得到了 'Null' 类型的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69294007/

相关文章:

Flutter - 如何在加载共享首选项时暂停应用程序?

部署函数时 Firebase CLI 不起作用。错误 : HTTP Error: 404, 找不到方法

flutter - 无法解析配置 ':app:debugRuntimeClasspath' 的所有文件。, flutter

Dart 产生来自另一个流监听器的流事件

dart - Flutter 更改其他页面上的主 appbar 标题

flutter - 在 ListView 、Flutter 中保留所选项目

flutter - 延迟 BottomNavigationBar

javascript - 如何更新 Firebase 中的所有 child ?

android - 当我随机检索它们时,如何防止 Firebase 数据库中的 key 冗余?

swift - 快速访问嵌套键值对