![](/img/trans.png)
[英]unhandled js exception: application main has not been registered expo TestFlight
[英]Flutter + Firebase Throwing Unhandled Exception: This widget has been unmounted Error Using Navigator to change view
我有一個 firebase 驅動的 Flutter 應用程序正在運行但拋出錯誤。
我所期望的是,當應用程序打開時,用戶必須使用 email 和密碼登錄,如果登錄成功,那么他們會看到一個名為 WelcomeScreen 的新視圖。
發生了什么,用戶在登錄后被帶到歡迎屏幕,但我收到以下錯誤
[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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.