应为 'Map<String, dynamic>' 类型的值,但得到了 'Null' 类型的值

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

我正在使用 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'


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

我已经确认 'users' -> uid -> 'userName' 的值是正确的。

加法 1:

我调试了 FutureBuilderbuilder

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

null

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

Instance of '_JsonDocumentSnapshot'

加法 2:

@Saiful Islam

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

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
════════════════════════════════════════════════════════════════════════════════

你能想到什么样的问题?

谢谢。

你应该只return文件的地图存在。但是,您没有检查此条件是否为真。 为了安全起见,不要 return 数据,除非它在 ​​if 语句中,该语句检查 hasData 然后 exists.

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

但是你的错误是从一开始就出现的,这一行:

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

你没有说是哪个文件。当你运行这个查询时,你需要传递文档的id

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