In my app I need execute code before call Navigator.push
. But problem is if user press back button before code is execute then there is error:
E/flutter ( 8415): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: Looking up a deactivated widget's ancestor is unsafe. E/flutter ( 8415): At this point the state of the widget's element tree is no longer stable. E/flutter ( 8415): To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling inheritFromWidgetOfExactType() in the widget's didChangeDependencies() method.
Issue is code is still execute and Navigator.push
is call even if user press back button (in Widget2
).
Here is mwe:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Widget1(),
);
}
}
class Widget1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: RaisedButton(
onPressed: () async {
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => Widget2(),
));
},
),
),
);
}
}
class Widget2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(body: RaisedButton(
onPressed: () async {
// Press back button before Future complete
await Future.delayed(Duration(seconds: 5));
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => Widget3(),
));
},
));
}
}
class Widget3 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(child: Text('Widget 3'));
}
}