我正在尝试打开一个页面并使用 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 做到这一点。有什么解决办法或者解释吗?
正如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)
此致
我想解决的问题: 我使用 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) 如何使用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) 我试图弄清楚如何利用 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) 我正在开发 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
在我的 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
我正在将 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) 在导航器中,我们可以使用.then. 例如:
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => XyzScreen(),
),
).then((value) => _someFuncion());
Run Code Online (Sandbox Code Playgroud)
那么有什么办法可以实现同样的功能go_router吗?
这是一个场景,我用来StatefulShellRoute保留应用程序中每个选项卡的状态,当用户登录或更改应用程序的语言时,我需要刷新StatefulShellRoute以加载新数据。
我尝试给UniqueKey每个应用程序一个StatefulShellBranch,但是当我热重载或使用检查器时,它会重建整个应用程序,这对性能和开发流程不利。
那么有什么干净的方法来刷新我的吗StatefulShellRoute?
flutter ×10
gorouter ×10
dart ×5
navigation ×4
riverpod ×2
animation ×1
callback ×1
firebase ×1
flutter-web ×1
mobile ×1
router ×1
routes ×1
transition ×1