标签: gorouter

Flutter go_router如何将结果返回到上一页?

我正在尝试打开一个页面并使用 go_router 包获取返回的结果。在导航 1.0 中我使用这个:

final result = await Navigator.push(
  context,
  MaterialPageRoute(builder: (context) => const SecondRoute()),
);
// handle result
Run Code Online (Sandbox Code Playgroud)

但我似乎无法用 go_router 做到这一点。有什么解决办法或者解释吗?

navigation routes dart flutter gorouter

35
推荐指数
2
解决办法
3万
查看次数

在 Flutter 中设置 go_router 的默认转换

正如go_router 的文档所描述的,为单个页面设置pageBuilder-Transitions 很容易。但是,我想为所有页面设置默认的 PageTransition。

如何在 Flutter 中使用 go_router 设置默认页面转换?

单页:


  // this is the proposed method to do it for single pages
  // how can i apply it to all pages without writing the same code?
  GoRoute(
      path: '/login',
      builder: (context, state) => const LoginScreen(),
      pageBuilder: (context, state) => CustomTransitionPage<void>(
        key: state.pageKey,
        child: const LoginScreen(),
        transitionsBuilder: (context, animation, secondaryAnimation, child) =>
            FadeTransition(opacity: animation, child: child),
      ),
    ),
Run Code Online (Sandbox Code Playgroud)

此致

navigation animation transition flutter gorouter

16
推荐指数
4
解决办法
2万
查看次数

如何在没有上下文的情况下在 Flutter 中使用 GoRouter 进行路由?

我想解决的问题: 我使用 GoRouter 的应用程序需要能够从 main() 内路由到命名路由。由于大多数路由都是“context.go”形式,因此我无法在 main 中执行此操作。

背景

我的应用程序使用 GoRouter。GetX 让我轻松定义命名路由并从 main() 传递参数,这非常完美。

然而,GetX 和 GoRouter 最终给我带来了问题。GoRouter 最终在应用程序的其他部分将没有上下文。

如果有一种方法可以让它们简单地共存,我会对此持开放态度。

我使用了 GetIt 包的服务定位器模式来与 navigatorKey 关联。当我测试它时它会起作用 - 但这涉及创建两个 MaterialApp。

然而,这个应用程序使用GoRouter,它似乎没有使用navigatorKey。

我想从 main() 内部转到特定的路线。服务定位器模式似乎适用于 GoRouter,就像适用于 MaterialApp 的 Navigator 2.0 一样——但我找不到如何执行此操作的示例。

更详细的上下文:

这是我目前在 main() 中的内容。

你可以看到我面临的关键挑战是在 main 中传递数据参数的监听器(我从第三方 SDK 得到这个——我不需要它在 main 中,但无论如何它都需要监听应用程序的状态)。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  FFAppState(); // Initialize FFAppState

  GetSocial.addOnInitializedListener(() => {
        // GetSocial SDK is ready to use
      });

  setupLocator();

  runApp(MyApp());

  locator<LandingPageData>().referralID = "defaultReferralID";

  registerListeners();
} …
Run Code Online (Sandbox Code Playgroud)

service-locator flutter gorouter

13
推荐指数
3
解决办法
1万
查看次数

如何使用 FLUTTER go_router 弹出上下文?

如何使用flutter的go_router返回到上一个屏幕?如何弹出上下文?

目前,我只是将一个新屏幕添加到堆栈中,无论我想返回还是前进。

 onTap: (() => context.go("/secondPage"))
Run Code Online (Sandbox Code Playgroud)

我已经使用过 context.pop(),但它抛出错误说 -

_AssertionError ('package:go_router/src/matching.dart': Failed assertion: line 102 pos 9: '_matches.isNotEmpty': You have popped the last page off of the stack, there are no pages left to show)

Run Code Online (Sandbox Code Playgroud)

navigation mobile dart flutter gorouter

9
推荐指数
2
解决办法
1万
查看次数

如何在 Flutter 中将 Stream 转换为 Listenable?

我试图弄清楚如何利用 Firebase 的流作为go_router包中参数onAuthStateChanges()中的可监听对象,以便在 authState 更改时进行重定向。此外,我正在使用flutter_riverpod进行状态管理。refreshListenable

到目前为止我的代码看起来像这样:

我创建了一个简单的 AuthService 类(缩减到最重要的部分):

abstract class BaseAuthService {
  Stream<bool> get isLoggedIn;
  Future<bool> signInWithEmailAndPassword({ required String email, required String password });
}

class AuthService implements BaseAuthService {
  final Reader _read;

  const AuthService(this._read);

  FirebaseAuth get auth => _read(firebaseAuthProvider);

  @override
  Stream<bool> get isLoggedIn => auth.authStateChanges().map((User? user) => user != null);

  @override
  Future<bool> signInWithEmailAndPassword({ required String email, required String password }) async {
    try {
      await auth.signInWithEmailAndPassword(email: email, password: password);
      return true; …
Run Code Online (Sandbox Code Playgroud)

dart firebase flutter gorouter riverpod

8
推荐指数
1
解决办法
3732
查看次数

如何在 flutter web 中使用 Go Router 在浏览器后退按钮或 onReload 页面上显示警报对话框?

我正在开发 Flutter Web并使用go_router进行导航。

期望: 从初始路线开始,当用户尝试使用浏览器后退按钮导航回来或重新加载页面时,应显示一个警告框并询问“您确定要退出吗?” 用户交互页面上的消息类型允许退出或停留在同一页面上。

尝试过的方法:

1.WillPopScope:

我在 HomeRoute Widget 上添加了 WillPopScope 小部件来检测 popCallBack。但不知何故,按下后退按钮时不会触发它,因为我可能使用了 go_router 进行导航。

通过执行下面的语句,我无法在控制台 onBack 事件上打印日志。

return WillPopScope(
      onWillPop: () async {
        print("on Will Pop is Called");
        return false;
      },
      child: PaintScaffold(...)
);
Run Code Online (Sandbox Code Playgroud)

MaterialApp.router 的 BackButtonDispatcher 仅适用于 android,不适用于 web。所以这是行不通的。参考之。

2. onBeforeUnload 监听器

我尝试在index.html 文件中添加脚本来检测onBeforeUnload 事件。但它的行为却出人意料。它在 chrome 浏览器中工作正常,但在 safari 中,按下后退按钮时不会显示警报框。但要努力重新加载页面。

在 iOS safari 浏览器上,当页面卸载时,在任何情况下都不会触发 onBeforeUnload。

  <script>
    window.addEventListener('load', function(ev) {
      // Download main.dart.js
      _flutter.loader.loadEntrypoint({
        serviceWorker: {
          serviceWorkerVersion: serviceWorkerVersion,
        }
      }).then(function(engineInitializer) {
        return …
Run Code Online (Sandbox Code Playgroud)

flutter gorouter flutter-navigation flutter-web flutter-go-router

8
推荐指数
1
解决办法
1142
查看次数

当已经在路由上时,如何使用 go_router 和 Firebase 身份验证处理 Flutter 中的身份验证?

在我的 Flutter 应用程序中,我使用该go_router包来管理路由和Firebase Authentication用户身份验证。我有几个屏幕需要用户经过身份验证才能访问,例如帐户管理、交易和详细信息。

目前,我已经实现了重定向,go_router以确保未经身份验证的用户被正确重定向。但是,当用户已经位于这些屏幕之一并注销或会话过期时,我面临着挑战。

我正在考虑使用 BlocListener 来检测每个屏幕上身份验证状态的变化,但这似乎会导致代码重复。由于 Firebase 身份验证,我还有一个 Stream 通知身份验证状态的更改,并更新变量contex.isUserSignIn

使用 go_router 和 Firebase 身份验证有效处理 Flutter 中的注销或会话过期事件的最佳实践是什么?

firebase-authentication flutter gorouter flutter-navigation flutter-go-router

8
推荐指数
1
解决办法
2293
查看次数

如何定义依赖于Provider的GoRouter?

我正在将 GoRouter 集成到我的 Flutter 应用程序中,我已经在使用 Riverpod。我有一个isAuthorizedProvider定义如下:

final isAuthorizedProvider = Provider<bool>((ref) {
  final authStateChanged = ref.watch(_authStateChangedProvider);
  final user = authStateChanged.asData?.value;
  return user != null;
});
Run Code Online (Sandbox Code Playgroud)

而且我不确定如何定义依赖于上面的 Provider 的 GoRouter。我想出了以下几点:

final goRouterProvider = Provider<GoRouter>((ref) => GoRouter(
      debugLogDiagnostics: true,
      redirect: (state) {
        final isAuthorized = ref.watch(isAuthorizedProvider);
        final isSigningIn = state.subloc == state.namedLocation('sign_in');

        if (!isAuthorized) {
          return isSigningIn ? null : state.namedLocation('sign_in');
        }

        // if the user is logged in but still on the login page, send them to
        // the home …
Run Code Online (Sandbox Code Playgroud)

dart flutter gorouter riverpod

7
推荐指数
1
解决办法
7746
查看次数

Flutter 中导航的回调函数

在导航器中,我们可以使用.then. 例如:

 Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => XyzScreen(),
        ),
      ).then((value) => _someFuncion());
Run Code Online (Sandbox Code Playgroud)

那么有什么办法可以实现同样的功能go_router吗?

navigation callback dart flutter gorouter

6
推荐指数
1
解决办法
2116
查看次数

在flutter中刷新StatefulShellRoute

这是一个场景,我用来StatefulShellRoute保留应用程序中每个选项卡的状态,当用户登录或更改应用程序的语言时,我需要刷新StatefulShellRoute以加载新数据。

我尝试给UniqueKey每个应用程序一个StatefulShellBranch,但是当我热重载或使用检查器时,它会重建整个应用程序,这对性能和开发流程不利。

那么有什么干净的方法来刷新我的吗StatefulShellRoute

router flutter gorouter flutter-go-router

6
推荐指数
0
解决办法
410
查看次数