我刚刚将我的
go_router
软件包从 12.1.3
迁移到 13.2.4
。
我检查了重大更改,但找不到有关
pop
的任何内容。目前我用这个扩展了我的上下文:
extension HelperExtensions on BuildContext {
void maybePop<T extends Object?>([T? result]) {
if (canPop()) {
return pop(result);
}
}
}
但是当在对话框中使用它时,它不会弹出它们,而是弹出它们下面的视图。当我这样做时
Navigator.of(this, rootNavigator: true).pop()
它起作用了。
有人可以解释一下为什么会这样吗?为什么对话框不再出现在导航器页面堆栈上?
现在使用 rootNavigator 正确吗?那
canPop()
还能做什么呢。当我随后使用 Navigator.of(this, rootNavigator: true).pop()
弹出对话框时,它是否仍然检查正确的内容?
非常感谢。
编辑 事实上,我只是想有一个方法,当我想弹出最上面推送的页面/对话框时可以调用。它应该首先检查是否有东西要弹出。因为即使堆栈上只有一件东西,它也可能被调用。
我使用您的扩展创建了一个 POC,它工作正常。这可能与您的路线或您处理对话的方式有关。
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
void main() {
runApp(MyApp());
}
final router = GoRouter(
initialLocation: '/',
routes: [
GoRoute(
path: '/',
builder: (context, state) => Page1(),
)
],
);
class Page1 extends StatelessWidget {
const Page1({
super.key,
});
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: ElevatedButton(
onPressed: () => showDialog(
context: context,
builder: (context) => Center(
child: Container(
color: Colors.white,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
Text('DIALOG'),
ElevatedButton(
onPressed: () => context.maybePop(),
child: Text('Close'),
)
],
),
),
),
),
child: Text('Open Dialog'),
),
),
);
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp.router(
title: 'My App',
routerConfig: router,
);
}
}
extension HelperExtensions on BuildContext {
void maybePop<T extends Object?>([T? result]) {
if (canPop()) {
return pop(result);
}
}
}