以前有人遇到过这个问题吗?
E/flutter (12975): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: Looking up a deactivated widget's ancestor is unsafe.
E/flutter (12975): At this point the state of the widget's element tree is no longer stable.
E/flutter (12975): To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.
在谷歌搜索时,我发现它与context
有关吗?这就是为什么我通过函数的参数传递上下文
下面是代码
class CustRegView extends StatefulWidget {
@override
_CustRegViewState createState() => _CustRegViewState();
}
class CustRegView extends StatelessWidget{
final TextEditingController _controller = TextEditingController();
@override
Widget build(BuildContext context) {
final deviceSize = MediaQuery.of(context).size;
return BaseView<CustRegViewModel>(
builder: (context, model, child) => Scaffold(
...<some code>
FlatButton (
onPressed: () async {
var registerSuccess = await model.register( _controller.text);
if (registerSuccess) {
Navigator.pushNamed(context, 'newScreen'); <--- E R R O R H E R E } else {
UIHelper().showErrorButtomSheet(context, model.errorMessage);
}
)
}
CustRegViewModel
看起来像这样
class CustRegViewModel extends BaseViewModel {
final AuthService _authService = locator<AuthService>();
final DialogService _dialogService = locator<DialogService>();
dynamic verifiedUserID ;
Future<bool> register(String phoneNo) async {
verifiedUserID = await verifyPhone(updatedPhoneNo);
return verifiedUserID != null ? true : false; // From here it
// returns true
}
Future<void> verifyPhone(phoneNo) async {
var completer = Completer<dynamic>();
await FirebaseAuth.instance.verifyPhoneNumber(
phoneNumber: updatedPhoneNo,
timeout: Duration(seconds: 50),
verificationCompleted: (AuthCredential authCred) async {...... <some code>
verificationFailed: (AuthException authException) {...... <some code>
codeSent: (String verID, [int forceCodeResend]) async {...... <some code>
codeAutoRetrievalTimeout: (String verID) {...
).catchError((error) {...... <some code>
return completer.future;
}
}
main
类看起来像这样
void main() {
setupLocator();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final GlobalKey<NavigatorState> navigatorKey =
new GlobalKey<NavigatorState>();
@override
Widget build(BuildContext context) {
return StreamProvider<User>(
initialData: User.initial(),
create: (BuildContext context) => locator<AuthService>().user,
child: MaterialApp(
builder: (context, widget) => Navigator(
onGenerateRoute: (settings) => MaterialPageRoute(
builder: (context) => DialogManager(
child: widget,
),
),
),
title: 'Fitness Diet',
theme: ThemeData(),
initialRoute: 'splash',
navigatorKey: navigatorKey,
onGenerateRoute: Router.generateRoute,
),
);
}
}