从initState导航返回对null调用了'findAncestorStateOfType'

问题描述

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

我的initState函数:

      @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);
      });
    });
  }

两种情况

  1. 第一个是数据库更改在用户打开应用前之前生效。然后,当用户打开应用程序时,他会直接路由到另一个屏幕,没有问题
  2. 另一方面,当应用程序打开且数据库更改生效时,用户将重定向到另一个屏幕,并出现上述错误:

调度程序库捕获的异常方法 在null上调用了'findAncestorStateOfType'。接收者:null已尝试 调用:findAncestorStateOfType()

我不明白为什么错误仅在第二种情况下有效。

请帮助我弄清楚我在做什么错。 预先感谢。

其他信息(完整代码):

class MainScreen extends StatefulWidget {
  @override
  _MainScreen createState() => _MainScreen();
}

class _MainScreen extends State<MainScreen> {
  Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
  final _scaffoldKey = new GlobalKey<ScaffoldState>();
  List<String> favoritGroupsList = List<String>();
  bool isLoading = true;
  Stream _groupsStream;

  @override
  void initState() {
    // TODO: implement initState
    checkFirstScreen();
    _groupsStream = FirebaseFirestore.instance
        .collection('groups')
        .where('guests',arrayContains: globals.user.userId)
        .orderBy('status')
        .snapshots();
    if (_groupsStream != null) {
      FirebaseFirestore.instance
          .collection('groups')
          .where('members',arrayContains: globals.user.userId)
          .limit(1)
          .snapshots()
          .listen((event) {
        event.docs.forEach((doc) {
          joinUserToGroup(context,doc.id);
        });
      });
    }
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) => {
          initFunctions(),Network().getAvailableFriends().then((value) => showSnackBar())
        });
  }

  void initFunctions() async {
    await Network().getAllUser();
    await Network().getUser();
    if (this.mounted) {
      setState(() {
        isLoading = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () async => false,child: Scaffold(
        key: _scaffoldKey,appBar: AppBar(
        .
        .
        .
      ),);
  }

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

问题出在导航器的joinUserToGroup函数中。 谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)