【问题标题】:Flutter web + go_router, when direct visit to: /page, how to go back to / (root)Flutter web + go_router,直接访问:/page,如何回到/(root)
【发布时间】:2023-02-02 18:49:02
【问题描述】:

我正在使用 go_router 并获得了这样的配置:

final router = GoRouter(
  initialLocation: '/',
  routes: [
    GoRoute(path: '/', pageBuilder: (context, state) => const MaterialPage(child: MyHomePage(title: 'Flutter Demo Home Page')),),
    GoRoute(path: '/second', pageBuilder: (context, state) => const MaterialPage(child: MyHomePage(title: 'Second !')),),
  ],
);

当我直接访问网页时使用:/second 页面正确打开,但无法返回到:/(应用程序栏中没有后退箭头)。

如果我转到/,然后通过context.push("/second");打开/second页面,那么自然会出现后退箭头。

当我直接在浏览器中输入URI时,如何确保应用栏后退箭头让我转到初始页面?

完整示例:

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';

void main() {
  runApp(const MyApp());
}

final router = GoRouter(
  initialLocation: '/',
  routes: [
    GoRoute(path: '/', pageBuilder: (context, state) => const MaterialPage(child: MyHomePage(title: 'Flutter Demo Home Page')),),
    GoRoute(path: '/second', pageBuilder: (context, state) => const MaterialPage(child: MyHomePage(title: 'Second !')),),
  ],
);

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      routerConfig: router,
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              '',
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          context.push("/second");
        },
        tooltip: 'Navigate',
        child: const Icon(Icons.navigate_next),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter flutter-navigation flutter-go-router


    【解决方案1】:

    要从应用栏的任何位置返回根目录,请使用以下命令:

     Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                const Text(
                  '',
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () {
              Navigator.of(context, rootNavigator: true).pushAndRemoveUntil(
                MaterialPageRoute(
                    builder: (context) => const  MyHomePage(title: 'Flutter Demo Home Page')),
                (route) => true);
            },
            tooltip: 'Navigate',
            child: const Icon(Icons.navigate_next),
          ),
        );
      }
    }
    

    您可以使用此代码来支持 root:

      Navigator.of(context, rootNavigator: true).pushAndRemoveUntil(
                MaterialPageRoute(
                    builder: (context) => const  MyHomePage(title: 'Flutter Demo Home Page')),
                (route) => true);
    

    【讨论】:

    • 好吧,就我而言,我可以使用:context.go("/");,但这不是重点。重点是在应用程序栏中显示后退箭头,就好像根目录在那里一样。您的回答无视我正在使用路由器的事实。
    • 你到底什么意思?您是要返回根目录还是返回上一页?
    • 理想情况下,我想通过AppBar 返回根目录,就好像它是上一页一样。
    猜你喜欢
    • 2022-07-25
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2017-07-08
    相关资源
    最近更新 更多