Flutter - NoSuchMethodError:方法'[]'在null上被调用

Posted

技术标签:

【中文标题】Flutter - NoSuchMethodError:方法\'[]\'在null上被调用【英文标题】:Flutter - NoSuchMethodError: The method '[]' was called on nullFlutter - NoSuchMethodError:方法'[]'在null上被调用 【发布时间】:2020-04-09 07:56:53 【问题描述】:

我在尝试使用 FutureBuilder 从 Firestore 获取数据时遇到错误。如果用户登录并打印 (snapshot.data),我会从 firestore 中获取正确的快照:

flutter: FirebaseUser(displayName: null, providerId: Firebase, uid: UFubdB2xPCTUu8ESgQikOr9WOe52, phoneNumber: null, isEmailVerified: false, providerData: [email: titi@momo.com, providerId: password, photoUrl: null, displayName: null, uid: titi@momo.com, phoneNumber: null], email: titi@momo.com, photoUrl: null, lastSignInTimestamp: 1576367769805, isAnonymous: false, creationTimestamp: 1576367424402)

但是,如果我导航到 Feed 屏幕,它会在我打印时引发异常 (snapshot.data['email'])

flutter: ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
flutter: The following NoSuchMethodError was thrown building FutureBuilder<DocumentSnapshot>(dirty, state:
flutter: _FutureBuilderState<DocumentSnapshot>#5d856):
flutter: The method '[]' was called on null.
flutter: Receiver: null
flutter: Tried calling: []("email")
flutter:
flutter: The relevant error-causing widget was:
flutter:   FutureBuilder<DocumentSnapshot> file:///Users/momo/Desktop/combine/lib/screens/feed.dart:23:13
flutter:
flutter: When the exception was thrown, this was the stack:
flutter: #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5)
flutter: #1      _FeedState.build.<anonymous closure> (package:combine/screens/feed.dart:26:30)
flutter: #2      _FutureBuilderState.build (package:flutter/src/widgets/async.dart)
flutter: #3      StatefulElement.build (package:flutter/src/widgets/framework.dart:4334:27)
flutter: #4      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4223:15)
flutter: #5      Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
flutter: #6      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
flutter: #7      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4381:11)
flutter: #8      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
flutter: #9      Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #10     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #11     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
flutter: #12     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
flutter: #13     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
flutter: #14     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
flutter: #15     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #16     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #17     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
flutter: #18     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
flutter: #19     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
flutter: #20     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
flutter: #21     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #22     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #23     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
flutter: #24     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
flutter: #25     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
flutter: #26     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
flutter: #27     ParentDataElement.mount (package:flutter/src/widgets/framework.dart:4617:11)
flutter: #28     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #29     MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5551:32)
flutter: #30     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #31     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #32     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
flutter: #33     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
flutter: #34     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
flutter: #35     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4381:11)
flutter: #36     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
flutter: #37     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #38     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #39     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
flutter: #40     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
flutter: #41     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
flutter: #42     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
flutter: #43     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #44     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #45     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
flutter: #46     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
flutter: #47     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
flutter: #48     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4381:11)
flutter: #49     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
flutter: #50     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #51     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #52     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5445:14)
flutter: #53     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #54     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #55     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
flutter: #56     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
flutter: #57     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
flutter: #58     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
flutter: #59     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #60     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #61     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5445:14)
flutter: #62     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #63     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #64     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
flutter: #65     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
flutter: #66     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
flutter: #67     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4381:11)
flutter: #68     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
flutter: #69     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #70     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #71     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
flutter: #72     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
flutter: #73     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
flutter: #74     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4381:11)
flutter: #75     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
flutter: #76     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #77     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #78     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
flutter: #79     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
flutter: #80     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
flutter: #81     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
flutter: #82     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #83     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #84     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
flutter: #85     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
flutter: #86     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
flutter: #87     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
flutter: #88     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #89     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #90     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
flutter: #91     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
flutter: #92     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
flutter: #93     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4381:11)
flutter: #94     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
flutter: #95     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #96     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #97     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
flutter: #98     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
flutter: #99     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
flutter: #100    StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4381:11)
flutter: #101    ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
flutter: #102    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #103    Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #104    SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5445:14)
flutter: #105    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #106    Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #107    SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5445:14)
flutter: #108    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #109    Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #110    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
flutter: #111    Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
flutter: #112    ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
flutter: #113    ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
flutter: #114    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #115    Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #116    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
flutter: #117    Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
flutter: #118    ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
flutter: #119    ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
flutter: #120    ParentDataElement.mount (package:flutter/src/widgets/framework.dart:4617:11)
flutter: #121    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #122    Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #123    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
flutter: #124    Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
flutter: #125    ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
flutter: #126    StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4381:11)
flutter: #127    ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
flutter: #128    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #129    Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #130    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
flutter: #131    Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
flutter: #132    ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
flutter: #133    ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
flutter: #134    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
flutter: #135    Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
flutter: #136    SliverMultiBoxAdaptorElement.updateChild (package:flutter/src/widgets/sliver.dart:1288:36)
flutter: #137    SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1273:20)
flutter: #138    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2412:19)
flutter: #139    SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:1266:11)
flutter: #140    RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure> (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:354:23)
flutter: #141    RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1823:58)
flutter: #142    PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:875:15)
flutter: #143    RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1823:13)
flutter: #144    RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:343:5)
flutter: #145    RenderSliverMultiBoxAdaptor.insertAndLayoutChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:489:5)
flutter: #146    RenderSliverFixedExtentBoxAdaptor.performLayout (package:flutter/src/rendering/sliver_fixed_extent_list.dart:255:17)
flutter: #147    RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
flutter: #148    RenderSliverEdgeInsetsPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:134:11)
flutter: #149    _RenderSliverFractionalPadding.performLayout (package:flutter/src/widgets/sliver.dart:1165:11)
flutter: #150    RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
flutter: #151    RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:410:13)
flutter: #152    RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1367:12)
flutter: #153    RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1285:20)
flutter: #154    RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1584:7)
flutter: #155    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:844:18)
flutter: #156    RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:344:19)
flutter: #157    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:774:13)
flutter: #158    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:283:5)
flutter: #159    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1102:15)
flutter: #160    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1041:9)
flutter: #161    SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:957:5)
flutter: #165    _invoke (dart:ui/hooks.dart:259:10)
flutter: #166    _drawFrame (dart:ui/hooks.dart:217:3)
flutter: (elided 3 frames from package dart:async)
flutter:
flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════
flutter: Another exception was thrown: NoSuchMethodError: The method '[]' was called on null.
flutter: titi@momo.com

但是,如果我在 Feed 屏幕上只打印 (snapshot.data),它会在获取实例之前抛出一个空值。

flutter: null
flutter: null
flutter: Instance of 'DocumentSnapshot'

从主页导航

class MyApp extends StatelessWidget 
  Widget _getScreenId() 
    return StreamBuilder<FirebaseUser>(
        stream: FirebaseAuth.instance.onAuthStateChanged,
        builder: (BuildContext context, snapshot) 
          if (snapshot.hasData) 
            print(snapshot.data);
            return Landing(userId: snapshot.data.uid);
           else 
            return Login();
          
        );
  

从着陆导航到 Feed 屏幕

children: <Widget>[
          Home(),
          Feed(userId: widget.userId),
          Profile(),
        ],

Feed 屏幕

class Feed extends StatefulWidget 
  final String userId;

  Feed(this.userId);

  @override
  _FeedState createState() => _FeedState();


class _FeedState extends State<Feed> 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.white,
        elevation: 1,
        title: Text('feed screen'),
      ),
      backgroundColor: Colors.white,
      body: FutureBuilder(
        future: usersRef.document(widget.userId).get(),
        builder: (BuildContext context, AsyncSnapshot snapshot) 
          print(snapshot.data['email']);
          return Padding(
            padding: const EdgeInsets.only(top: 70, left: 20, right: 20),
            child: Column(
              children: <Widget>[
                Text('MeandYou')
              ],
            ),
          );
        ,
      ),
    );
  

usersRef

final usersRef = _firestore.collection('users');

用户模型

User(
      this.id,
      this.email,
      this.password,
      this.fullname,
      this.username,
      this.mobile,
      this.profileImgUrl,
      this.bio);

  factory User.fromDoc(DocumentSnapshot doc) 
    return User(
      id: doc.documentID,
      email: doc['email'],
      fullname: doc['fullname'],
      username: doc['username'],
      mobile: doc['mobile'],
      profileImgUrl: doc['profileImgUrl'],
      bio: doc['bio'] ?? ''
    );
  

我已经尝试了几种选择,希望能得到一些帮助

【问题讨论】:

这是 Marcus Ng 的教程吗?我也有同样的问题... @XiaochaoYang 是的。请检查以下解决方案。 【参考方案1】:

Future 并不总是准备就绪,它们是异步的。我会插入 至少 一个空检查,但这是一个更好的方法。最好检查FutureConnectionState 是否准备好,然后查看数据是否为空。使用ConnectionState 的另一个好处是能够检查它是否在等待某事。然后,您可以显示加载图标或其他内容。

class _FeedState extends State<Feed> 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.white,
        elevation: 1,
        title: Text('feed screen'),
      ),
      backgroundColor: Colors.white,
      body: FutureBuilder(
        future: usersRef.document(widget.userId).get(),
        builder: (BuildContext context, AsyncSnapshot snapshot) 
          if (snapshot.connectionState == ConnectionState.done) 
            if (snapshot.hasData) 
              print(snapshot.data['email']);
              return Padding(
                padding: const EdgeInsets.only(top: 70, left: 20, right: 20),
                child: Column(
                  children: <Widget>[
                    Text('MeandYou')
                  ],
                ),
              );
            
          
        ,
      ),
    );
  

【讨论】:

我试过了,但还是有错误。 flutter: Class 'DocumentSnapshot' has no instance getter 'isNotEmpty'. flutter: Receiver: Instance of 'DocumentSnapshot' flutter: Tried calling: isNotEmpty 哎呀它实际上是 snapshot.hasData 更好的方法是为您的课程使用 Streams 和业务逻辑代码。流监视事件并处理这些事件,然后返回数据。

以上是关于Flutter - NoSuchMethodError:方法'[]'在null上被调用的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 13 和 Flutter 2.5.1 - 致命错误:找不到“Flutter/Flutter.h”文件 #import <Flutter/Flutter.h>

Flutter 致命错误:找不到“Flutter/Flutter.h”文件

[Flutter] flutter项目一直卡在 Running Gradle task 'assembleDebug'...

flutter 日志输出,Flutter打印日志,flutter log,flutter 真机日志

Flutter开发 Flutter 包和插件 ( Flutter 包和插件简介 | 创建 Flutter 插件 | 创建 Dart 包 )

flutter与原生混编(iOS)