ios - Flutter + Firebase 抛出未处理的异常 : This widget has been unmounted Error Using Navigator to change view

标签 ios firebase flutter dart firebase-authentication

我有一个 firebase 驱动的 Flutter 应用程序,它可以运行但会抛出错误。

如我所料,当应用程序打开时,用户必须使用电子邮件和密码登录,如果登录成功,他们将看到一个名为 WelcomeScreen 的新 View 。

发生了什么,用户在登录后被带到欢迎屏幕,但我收到以下错误

[VERBOSE-2:ui_dart_state.cc(186)] Unhandled Exception: This widget has been unmounted, so the State no longer has a context (and should be considered defunct).
Consider canceling any active work during "dispose" or using the "mounted" getter to determine if the State is still active.
#0      State.context.<anonymous closure> (package:flutter/src/widgets/framework.dart:1088:9)
#1      State.context (package:flutter/src/widgets/framework.dart:1094:6)
#2      _AuthScreenState.initState.<anonymous closure> (package:autos_latinos/screens/auth_screen.dart:81:35)
#3      _rootRunUnary (dart:async/zone.dart:1362:47)
#4      _CustomZone.runUnary (dart:async/zone.dart:1265:19)
#5      _CustomZone.runUnaryGuarded (dart:async/zone.dart:1170:7)
#6      _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11)
#7      _DelayedData.perform (dart:async/stream_impl.dart:591:14)
#8      _StreamImplEvents.handleNext (dart:async/stream_impl.dart:706:11)
#9      _PendingEvents.schedule.<anonymous closur<…>

它似乎指向我用来跟踪来自 firebase 的 authStateChanges 的代码中的这一部分:

FirebaseAuth.instance.authStateChanges().listen((User user) {
      if (user == null) {
        print('User is currently signed out!');
        if(AuthScreen.id != '/AuthScreen'){
          Navigator.pushReplacement(context, MaterialPageRoute(builder: (BuildContext context) => AuthScreen()));
        }else{
          print("Already on auth screen");
        }


      } else {
        //Send to welcome screen
        print('User is signed in!');
        Navigator.pushReplacement(context, MaterialPageRoute(builder: (BuildContext context) => WelcomeScreen()));
      }
    });

非常感谢任何有关如何防止此错误的建议。

最佳答案

您必须像这样在有状态小部件的 dispose 方法中处理监听器:

class Sample extends StatefulWidget {
  @override
  _SampleState createState() => _SampleState();
}

class _SampleState extends State<Sample> {
  StreamSubscription<User> _listener;

  @override
  Widget build(BuildContext context) {
    return Container();
  }

  @override
  void initState() {
    _listener = FirebaseAuth.instance.authStateChanges().listen((User user) {
      if (user == null) {
        print('User is currently signed out!');
        if (AuthScreen.id != '/AuthScreen') {
          Navigator.pushReplacement(
              context,
              MaterialPageRoute(
                  builder: (BuildContext context) => AuthScreen()));
        } else {
          print("Already on auth screen");
        }
      } else {
        //Send to welcome screen
        print('User is signed in!');
        Navigator.pushReplacement(
            context,
            MaterialPageRoute(
                builder: (BuildContext context) => WelcomeScreen()));
      }
    });
    super.initState();
  }

  @override
  void dispose() {
    _listener.cancel();
    super.dispose();
  }
}

关于ios - Flutter + Firebase 抛出未处理的异常 : This widget has been unmounted Error Using Navigator to change view,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66896767/

相关文章:

iphone - uitableviewcell 中的编辑模式仅适用于 ios 5.0

ios - 当我滚动 TableView 时,它删除了选定的项目 - Objective-c

javascript - messages.onMessage 不是一个函数

ios - 从 Firebase 检索数据到 TableView

android-studio - 将 android studio 更新到版本 3.4 后 Gradle 失败

flutter - 如何在 flutter 中为路径设置动画?

ios - Codility 编程测试和 Objective-C 语法

ios - objective-c 中当前位置的邮政编码?

android - 谁拥有这封电子邮件? ... @cloudteSTLabaccounts.com

flutter - 如果我使用无状态小部件,我应该关闭 Streams 吗?