Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 从initState返回导航';findAncestorStateOfType';被调用为空_Flutter_Google Cloud Firestore_Flutter Navigation_Flutter State - Fatal编程技术网

Flutter 从initState返回导航';findAncestorStateOfType';被调用为空

Flutter 从initState返回导航';findAncestorStateOfType';被调用为空,flutter,google-cloud-firestore,flutter-navigation,flutter-state,Flutter,Google Cloud Firestore,Flutter Navigation,Flutter State,我正在侦听initState中的数据库更改(firestore)。对于特定的更改,我需要将用户路由到另一个屏幕 我的初始状态函数: @override void initState() { super.initState(); FirebaseFirestore.instance .collection('groups') .where('members', arrayContains: globals.user.userId)

我正在侦听initState中的数据库更改(firestore)。对于特定的更改,我需要将用户路由到另一个屏幕

我的初始状态函数:

      @override
  void initState() {
    super.initState();
    FirebaseFirestore.instance
        .collection('groups')
        .where('members', arrayContains: globals.user.userId)
        .limit(1)
        .snapshots()
        .listen((event) {
      event.docs.forEach((doc) {
        Navigator.of(context).pushNamedAndRemoveUntil(
            '/GroupScreen', (Route<dynamic> route) => false);
      });
    });
  }
@覆盖
void initState(){
super.initState();
FirebaseFirestore.instance
.集合(“组”)
.where('members',arrayContains:globals.user.userId)
.限额(1)
.快照()
.听((事件){
event.docs.forEach((doc){
Navigator.of(context.pushName和removeUntil)(
“/GroupScreen',(路由)=>false);
});
});
}
有两种情况:

  • 第一个是当数据库更改在用户打开应用程序之前生效时。然后,当用户打开应用程序时,他会毫无问题地直接转到另一个屏幕
  • 另一方面,当应用程序打开且数据库更改生效时,用户将重定向到另一个屏幕,出现上述错误:
  • 该方法的调度程序库捕获异常 对null调用了“findAncestorStateOfType”。接收者:无效 调用:findAncestorStateOfType()

    我不明白为什么这个错误只对第二种情况有效

    请帮我找出我做错了什么。 提前谢谢

    额外信息(完整代码):
    class主屏幕扩展StatefulWidget{
    @凌驾
    _MainScreen createState()=>\u MainScreen();
    }
    类_主屏幕扩展状态{
    Future_prefs=SharedReferences.getInstance();
    最终_scaffoldKey=新的GlobalKey();
    List favoritGroupsList=List();
    bool isLoading=true;
    流(组)流;;
    @凌驾
    void initState(){
    //TODO:实现initState
    checkFirstScreen();
    _groupsStream=FirebaseFirestore.instance
    .集合(“组”)
    .where('guests',arrayContains:globals.user.userId)
    .orderBy('状态')
    .快照();
    如果(_groupsStream!=null){
    FirebaseFirestore.instance
    .集合(“组”)
    .where('members',arrayContains:globals.user.userId)
    .限额(1)
    .快照()
    .听((事件){
    event.docs.forEach((doc){
    joinUserToGroup(上下文,doc.id);
    });
    });
    }
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback(())=>{
    initFunctions(),
    网络().getAvailableFriends().then((值)=>showSnackBar())
    });
    }
    void initFunctions()异步{
    等待网络();
    等待网络();
    如果(本安装){
    设置状态(){
    isLoading=false;
    });
    }
    }
    @凌驾
    小部件构建(构建上下文){
    返回式示波器(
    onWillPop:()async=>false,
    孩子:脚手架(
    钥匙:_scaffoldKey,
    appBar:appBar(
    .
    .
    .
    ),
    );
    }
    joinUserToGroup(BuildContext上下文,字符串groupId){
    globals.tempGroup.groupId=groupId;
    Navigator.of(context.pushName和removeUntil)(
    “/GroupScreen',(路由)=>false);
    _groupsStream=null;
    }
    }
    
    问题在于joinUserToGroup函数中的导航器。
    谢谢!

    您应该等到数据可用,然后将代码放入这样一个具有未来前景的函数中

    Future<viod> someFunction() async{
      FirebaseFirestore.instance
            .collection('groups')
            .where('guests', arrayContains: globals.user.userId)
            .snapshots()
            .listen((event) {
          event.docs.forEach((doc) {
            if (doc['members'].contains(globals.user.userId)) {
              SchedulerBinding.instance.addPostFrameCallback((_) {
                Navigator.of(context).pushNamedAndRemoveUntil(
                    '/GroupScreen', (Route<dynamic> route) => false);
              });
            }
          });
        });
    }
    

    我认为这可能是可行的

    您应该等到数据可用时,然后将代码放入一个具有类似未来的函数中

    Future<viod> someFunction() async{
      FirebaseFirestore.instance
            .collection('groups')
            .where('guests', arrayContains: globals.user.userId)
            .snapshots()
            .listen((event) {
          event.docs.forEach((doc) {
            if (doc['members'].contains(globals.user.userId)) {
              SchedulerBinding.instance.addPostFrameCallback((_) {
                Navigator.of(context).pushNamedAndRemoveUntil(
                    '/GroupScreen', (Route<dynamic> route) => false);
              });
            }
          });
        });
    }
    

    我认为这可能是工作

    我发现你的问题在于
    BuildContext
    上下文,你在
    BuildContext
    之外调用navigator,这就是为什么你会出现这个错误,所以你必须提供上下文,因为没有上下文你无法创建新的屏幕,也许这个链接可以帮助你

    void someFunction(BuildContext){
    FirebaseFirestore.instance
    .集合(“组”)
    .where('guests',arrayContains:globals.user.userId)
    .快照()
    .听((事件){
    event.docs.forEach((doc){
    if(doc['members'].contains(globals.user.userId)){
    SchedulerBinding.instance.addPostFrameCallback((){
    Navigator.of(context.pushName和removeUntil)(
    “/GroupScreen',(路由)=>false);
    });
    }
    });
    });
    }
    void initState(){
    super.initState();
    someFunction();
    }
    
    我发现您的问题在于
    BuildContext
    上下文,您在
    BuildContext
    之外调用navigator,这就是为什么您会出现此错误,因此您必须提供上下文,因为没有上下文,您无法创建新屏幕。此链接可能会对您有所帮助

    void someFunction(BuildContext){
    FirebaseFirestore.instance
    .集合(“组”)
    .where('guests',arrayContains:globals.user.userId)
    .快照()
    .听((事件){
    event.docs.forEach((doc){
    if(doc['members'].contains(globals.user.userId)){
    SchedulerBinding.instance.addPostFrameCallback((){
    Navigator.of(context.pushName和removeUntil)(
    “/GroupScreen',(路由)=>false);
    });
    }
    });
    });
    }
    void initState(){
    super.initState();
    someFunction();
    }
    
    您的代码下是否会出现类似红线的错误,因为您的代码在 您可以像下面的代码一样提供正确的参数

    
    joinUserToGroup(BuildContext context, String groupId) {
        globals.tempGroup.groupId = groupId;
    
       return Navigator.pushNamedAndRemoveUntil(
                        context,
                        '/GroupScreen',
                        (route) => false);
                  },
        _groupsStream = null;
      }
    }
    

    我想这就是让你的应用程序正常运行所需要的一切。如果你遇到新的错误,请添加一条评论。你是否会在代码下出现任何类似红线的错误,因为你的代码在 您可以像下面的代码一样提供正确的参数

    
    joinUserToGroup(BuildContext context, String groupId) {
        globals.tempGroup.groupId = groupId;
    
       return Navigator.pushNamedAndRemoveUntil(
                        context,
                        '/GroupScreen',
                        (route) => false);
                  },
        _groupsStream = null;
      }
    }
    

    我想这就是让你的应用程序正常运行所需的全部。如果你遇到新的错误,请添加一条评论

    我是通过在外部提供导航器来创建你的应用程序的,我遇到了相同的错误,因为你
    
    joinUserToGroup(BuildContext context, String groupId) {
        globals.tempGroup.groupId = groupId;
    
       return Navigator.pushNamedAndRemoveUntil(
                        context,
                        '/GroupScreen',
                        (route) => false);
                  },
        _groupsStream = null;
      }
    }