我已经阅读了有关该主题的其他答案,但我有点困惑。
我有这种非常常见的情况,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
我在这里错过了什么?
这是一个工作示例:
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
小部件。我希望这将有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句