繁体   English   中英

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

[英]Flutter - NoSuchMethodError: The method '[]' was called on null

我在尝试使用 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();
          }
        });
  }

从 Landing 导航到 Feed 屏幕

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

馈送屏幕

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')
              ],
            ),
          );
        },
      ),
    );
  }
}

用户参考

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'] ?? ''
    );
  }

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

Futures 并不总是准备好,它们是异步的。 我会至少插入一个空检查,但这是一个更好的方法。 最好先检查一下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')
                  ],
                ),
              );
            }
          }
        },
      ),
    );
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM