<13

问题描述 投票:0回答:1

我刚刚将我的

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()
弹出对话框时,它是否仍然检查正确的内容?

非常感谢。

编辑 事实上,我只是想有一个方法,当我想弹出最上面推送的页面/对话框时可以调用。它应该首先检查是否有东西要弹出。因为即使堆栈上只有一件东西,它也可能被调用。

flutter dart flutter-go-router
1个回答
0
投票

我使用您的扩展创建了一个 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);
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.