Firebase Fatter NoSuchMethodError被抛出building FutureBuilder<;文档快照>;

Firebase Fatter NoSuchMethodError被抛出building FutureBuilder<;文档快照>;,firebase,flutter,dart,google-cloud-firestore,flutter-dependencies,Firebase,Flutter,Dart,Google Cloud Firestore,Flutter Dependencies,我在尝试从cloud_firestore获取用户数据时遇到此错误,但只有在用户首次登录应用程序并导航到配置文件屏幕时才会遇到此错误如果我在登录状态下热重启或重新运行应用程序,错误将消失 flutter: ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══ flutter: The following NoSuchMethodError was thrown building StreamBuilder<DocumentSnapshot>(dirt

我在尝试从cloud_firestore获取用户数据时遇到此错误,但只有在用户首次登录应用程序并导航到配置文件屏幕时才会遇到此错误如果我在登录状态下热重启或重新运行应用程序,错误将消失

flutter: ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══
flutter: The following NoSuchMethodError was thrown building StreamBuilder<DocumentSnapshot>(dirty, state:
flutter: _StreamBuilderBaseState<DocumentSnapshot, AsyncSnapshot<DocumentSnapshot>>#f33a1):
flutter: The method '[]' was called on null.
flutter: Receiver: null
flutter: Tried calling: []("name")
flutter:
flutter: User-created ancestor of the error-causing widget was:
flutter:   SliverFillRemaining
flutter:   file:///Users/ishangavidusha/Development/MUD/mud_mobile_app/lib/screens/profile_screen.dart:102:13
flutter:
flutter: When the exception was thrown, this was the stack:
flutter: #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
flutter: #1      new User.from (package:mud_mobile_app/models/user_model.dart:23:22)
flutter: #2      _ProfileScreenState.build.<anonymous closure> (package:mud_mobile_app/screens/profile_screen.dart:107:38)
flutter: #3      StreamBuilder.build (package:flutter/src/widgets/async.dart:425:74)
flutter: #4      _StreamBuilderBaseState.build (package:flutter/src/widgets/async.dart:125:48)
flutter: #5      StatefulElement.build (package:flutter/src/widgets/framework.dart:4047:27)
flutter: #6      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3941:15)
flutter: #7      Element.rebuild (package:flutter/src/widgets/framework.dart:3738:5)
flutter: #8      BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2348:33)
flutter: #9      WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:760:20)
flutter: #10     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:280:5)
flutter: #11     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1033:15)
flutter: #12     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:975:9)
flutter: #13     SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:891:5)
flutter: #17     _invoke (dart:ui/hooks.dart:249:10)
flutter: #18     _drawFrame (dart:ui/hooks.dart:207:3)
flutter: (elided 3 frames from package dart:async)
FutureBuilder>

SliverFillRemaining(
  child: FutureBuilder(
    future: _getUserData(widget.userId),
    builder: (BuildContext context, AsyncSnapshot snapshot) {
      if (!snapshot.hasData) {
        return Padding(
          padding: const EdgeInsets.all(50.0),
          child: Center(
            child: CircularProgressIndicator(),
          ),
        );
      }
      User user = User.fromDoc(snapshot.data);
      return Column(
        children: <Widget>[
          Padding(...),
          Container(...),
          Container(...),
        ],
      );
    }
  )
)
Future<DocumentSnapshot> _getUserData(userId) async {
  return Firestore.instance.collection('users').document(userId).get();
}
sliverfill剩余(
孩子:未来建设者(
未来:_getUserData(widget.userId),
生成器:(BuildContext上下文,异步快照){
如果(!snapshot.hasData){
返回填充(
填充:常数边集全部(50.0),
儿童:中心(
子对象:CircularProgressIndicator(),
),
);
}
User User=User.fromDoc(snapshot.data);
返回列(
儿童:[
填充(…),
容器(…),
容器(…),
],
);
}
)
)
和功能文档快照返回>

SliverFillRemaining(
  child: FutureBuilder(
    future: _getUserData(widget.userId),
    builder: (BuildContext context, AsyncSnapshot snapshot) {
      if (!snapshot.hasData) {
        return Padding(
          padding: const EdgeInsets.all(50.0),
          child: Center(
            child: CircularProgressIndicator(),
          ),
        );
      }
      User user = User.fromDoc(snapshot.data);
      return Column(
        children: <Widget>[
          Padding(...),
          Container(...),
          Container(...),
        ],
      );
    }
  )
)
Future<DocumentSnapshot> _getUserData(userId) async {
  return Firestore.instance.collection('users').document(userId).get();
}
Future\u getUserData(userId)异步{
返回Firestore.instance.collection('users').document(userId.get();
}
如果快照数据未进行安全检查,则通常会显示“StreamBuilder脏状态”警告。这样可以确保快照包含数据。但是,如果(!snapshot.hasData)被设置为对您提供的代码段进行安全检查,则似乎是

flutter: The method '[]' was called on null.
flutter: Receiver: null
flutter: Tried calling: []("name")
从您提供的详细信息来看,错误似乎只发生在第一次用户登录时,但在热重启或应用程序重启时,错误会消失。我建议检查方法
\u getUserData(String userId)
是否能够在第一次用户登录时接收
userId
,通常会发生错误。根据您提供的日志,在发生错误的位置传递Null

flutter: The method '[]' was called on null.
flutter: Receiver: null
flutter: Tried calling: []("name")

stacktrace显示函数名为User.from,但代码显示User.fromDoc。这两个构造器是不同的吗?如果没有,请确保documentSnapshot中有数据。如果热重启,则处于不同的屏幕(很可能是登录屏幕),因此错误会自然消失,直到您点击配置文件屏幕。@ThinkDigital提出的问题是相关的。@ThinkDigital感谢您抽出时间。我真的不明白上面说的是什么。这不是两个不同的构造函数,但在stacktrace中显示为User.from.@RedEye是的,我知道了。我不记得是怎么解决的。我认为在我的例子中,用户id有问题。因为我通过小部件树传递用户id。