我已经阅读了有关该主题的其他答案,但我有些困惑。
我有一个非常常见的情况,ScreenA
触发导航到ScreenB
,ScreenB
完成其工作,然后用户点击“后退”按钮,我们返回到ScreenA
。此时,我想运行一些代码,但是我不知道该怎么做。
这是我导航到ScreenB
的代码:
Navigator.pushNamed(context, Router.ScreenB)
导航器:
class Router {
static const ScreenB = "/b";
static Route<dynamic> generateRoute(RouteSettings routeSettings) {
switch (routeSettings.name) {
case ScreenB :
return MaterialPageRoute(builder: (_) => ScreenB());
default:
return MaterialPageRoute(builder: (_) {
return Scaffold(
body: Center(
child: Text('No route defined for ${routeSettings.name}'),
),
);
});
}
}
}
我尝试做
Navigator.pushNamed(context, Router.ScreenB)
.then((value) {
//do stuff
});
但是从来没有调用then()
,即使我添加了
Navigator.pop(context);
在ScreenB
我在这里想念什么?
答案 0 :(得分:1)
这是一个可行的示例:
import 'package:flutter/material.dart';
import 'package:pop_test/router.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
onGenerateRoute: Router.generateRoute,
home: ScreenA(),
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class Router {
static const Screen_B = "/b";
static Route<dynamic> generateRoute(RouteSettings routeSettings) {
switch (routeSettings.name) {
case Screen_B:
return MaterialPageRoute(builder: (_) => ScreenB());
default:
return MaterialPageRoute(builder: (_) {
return Scaffold(
body: Center(
child: Text('No route defined for ${routeSettings.name}'),
),
);
});
}
}
}
class ScreenA extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Screen A"),
),
body: Center(
child: FlatButton(
onPressed: () {
Navigator.of(context).pushNamed(Router.Screen_B).then((value) {
print("do stuff");
});
},
child: Text("Push screen B"),
),
),
);
}
}
class ScreenB extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Screen B"),
),
body: Center(
child: FlatButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text("Pop"),
),
),
);
}
}
我应该提到由于与屏幕类的名称冲突,我已经重命名了Router.ScreenB
常量(也许这是您的问题吗?)。我认为,除此以外,没有其他更改。另外,通常最好使用async/await
而不是Future.then
。
顺便说一句,您已经写过用户回击时需要做的事情。如果在这里是指系统按钮,则应使用WillPopScope
小部件。我希望这会有所帮助。