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 并不总是准备就绪,它们是异步的。我会插入 至少 一个空检查,但这是一个更好的方法。最好检查Future
的ConnectionState
是否准备好,然后查看数据是否为空。使用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 包 )