Flutter:从另一个返回时更新屏幕
Flutter: update screen when coming back from another
我已经阅读了关于该主题的其他答案,但我有点困惑。
我有这种很常见的情况,ScreenA
触发导航到 ScreenB
,ScreenB
执行它的操作,然后用户点击后退按钮,我们 return至 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
常量,因为名称与屏幕 class 冲突(也许这是你的问题?)。除此以外,我认为,没有进行其他更改。此外,通常,最好使用 async/await
而不是 Future.then
。
顺便说一下,您已经写过当用户点击返回时您需要做一些事情。如果您在这里指的是系统按钮,那么您应该使用 WillPopScope
小部件。我希望这会有所帮助。
我已经阅读了关于该主题的其他答案,但我有点困惑。
我有这种很常见的情况,ScreenA
触发导航到 ScreenB
,ScreenB
执行它的操作,然后用户点击后退按钮,我们 return至 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
常量,因为名称与屏幕 class 冲突(也许这是你的问题?)。除此以外,我认为,没有进行其他更改。此外,通常,最好使用 async/await
而不是 Future.then
。
顺便说一下,您已经写过当用户点击返回时您需要做一些事情。如果您在这里指的是系统按钮,那么您应该使用 WillPopScope
小部件。我希望这会有所帮助。