关注此博客文章:https://blog.ishangavidusha.com/flutter-authentication-flow-with-go-router-and-provider
我已经使用 go router 实现了一个 flutter 应用程序。我已在我的 flutter 应用程序中添加了 firebase 身份验证处理程序initState():
@override
void initState() {
appService = AppService(widget.sharedPreferences);
authService = AuthService();
authSubscription = authService.onAuthStateChange.listen(onAuthStateChange);
super.initState();
}
Run Code Online (Sandbox Code Playgroud)
在我的 authservice 类中,我有一个如下的构造函数:
AuthService() {
authSubscription =
FirebaseAuth.instance.authStateChanges().listen((User? user) {
if (user == null) {
//appService.loginState = false;
print('User is currently signed out!');
_onAuthStateChange.add(false);
} else {
//appService.loginState = true;
print('User is signed in!');
_onAuthStateChange.add(true);
}
});
}
Run Code Online (Sandbox Code Playgroud)
一切正常。当我在应用程序中更改某些内容并保存更改时,应用程序会执行热重新加载。似乎热重载使前一个事件处理程序保持活动状态,因为每次热重载后,authStateChanges当我执行登录任务时,我都会再调用一次事件处理程序。热重载后,print('User is signed in!');登录后我会得到两个打印语句。每次热重载后还会有一个。
这是可以接受的开发行为还是我的应用程序架构不正确?
我已经firebase dynamic links在我的应用程序中集成并工作正常,后来我改为使用go_router,现在我不知道应该做什么才能让它工作或如何处理它。
我想象的方式是 FB 动态链接将与 中的页面path相同,并且 go_router 将自动转到该页面,但我不认为这就是它的工作原理,而且我找不到任何资源为了这。pathGoRouter routesredirect
那么问题是如何使用Firebase DynamicLinkswith go_router?
我正在尝试使用新的 Material You API 来实现 NavigationBar。
https://api.flutter.dev/flutter/material/NavigationBar-class.html
我只是想知道我们是否可以使用 Go_Router 包实现相同的功能。
我正在使用 go_router 和 Riverpod 开发 Flutter 应用程序,分别用于导航和状态管理。该应用程序有一个小部件,可以显示实时摄像头源,我想“关闭它”并在其他页面堆叠在其顶部时释放摄像头。
这是没有这样逻辑的GoRouter 代码示例。
GoRouter(
routes: [
GoRoute(
path: '/',
builder: (context, state) => CameraWidget(),
routes: [
GoRoute(
path: 'page1',
builder: (context, state) => Page1Screen(),
),
],
),
],
)
Run Code Online (Sandbox Code Playgroud)
我的第一次尝试是在 GoRoute 构建器中添加一些逻辑:
GoRouter(
routes: [
GoRoute(
path: '/',
builder: (context, state) {
if (state.location == "/") {
return CameraWidget();
}
return Center(child: Text("Camera not visible");
},
routes: [
GoRoute(
path: 'page1',
builder: (context, state) => Page1Screen(),
),
],
),
],
)
Run Code Online (Sandbox Code Playgroud)
但这显然不起作用 …
我在 flutter 上使用 go_router,并且有一个根路由和一个 shell 路由,其中所有子路由上都包含一个底部导航栏。我想推送一个位于 shell 路由之外的页面,并且我希望将其推送到根导航器上,因为它必须位于底部导航栏上方。
我已经检查了无数的 go_router 文档,但没有选项可以做到这一点。
我已经实现了一种方法来删除所有路由并在根导航器上推送页面,但是当弹出该页面时,它会转到一个空页面。但我希望它转到 shell 路由上的页面时所在的位置。
我正在为 Flutter Web 使用 go_router flutter 包。我在重新加载网站时收到此错误。后退按钮工作得很好,但重新加载会导致这种情况。
断言失败:org-dartlang-sdk:///flutter_web_sdk/lib/_engine/engine/window.dart:25:10 !_isUrlStrategySet“无法多次设置 URL 策略。”
下面是我的 main.dart 的代码:
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:navigator_2/some_app.dart';
import 'details_page.dart';
void main() {
runApp( MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final GoRouter _router = GoRouter(
urlPathStrategy: UrlPathStrategy.path,
routes: [
GoRoute(path: '/',builder: (context,state)=> const SomeAppPage()),
GoRoute(path: '/details',builder: (context,state){
final query = state.queryParams['index'];
return DetailsPage(index: int.parse(query!));
}),
]);
return MaterialApp.router(
routeInformationParser: _router.routeInformationParser,
routerDelegate: _router.routerDelegate ,
title: 'Go Router Example',
theme: ThemeData(
primarySwatch: Colors.blue,
), …Run Code Online (Sandbox Code Playgroud) 我想做的是,例如,如果路由器从登录到验证屏幕执行某些操作,但是当注册但未登录的上一个位置时,则不执行某些操作。
所以我想获取上一个位置对其进行一些逻辑,我知道我可以将参数传递到页面,然后从中执行逻辑,例如传递一个 bool 并在 true 或 false 时执行逻辑,但我想要更好或正确的方式,如果你知道我想要的话。谢谢。
我在 go router 中遇到了这个方法,它的作用是什么?它仅用于记录目的吗?我尝试在参数中添加路线名称或位置,但它会引发错误。我需要在这里输入什么参数,我不知道在哪里可以找到路线,谢谢。
context.didPush(Route<dynamic> route, Route<dynamic>? previousRoute);
Run Code Online (Sandbox Code Playgroud) 我有我的路由的配置类,我通过模块使用它,如下代码所示:
class RouterRegister {
static RouterRegister? _instance;
static RouterRegister getIntance() {
return _instance ??= RouterRegister();
}
final RouterConfig<Object> router = GoRouter(
navigatorKey: GlobalKey<NavigatorState>(),
initialLocation: '/',
observers: [
FirebaseAnalyticsObserver(analytics: FirebaseAnalytics.instance)
],
routes: <RouteBase>[
ShellRoute(
builder: (context, __, child) => child,
routes: [
...MicroAuthRoutes.getIntance().routes,
],
)
],
);
}
Run Code Online (Sandbox Code Playgroud)
我的 MicroAuthRoutes 类是这样的:
class MicroAuthRoutes {
static const splash = '/';
static const login = '/login';
static const forgot = '/forgot';
static const signup = '/signup';
static const token = '/token';
static MicroAuthRoutes? …Run Code Online (Sandbox Code Playgroud) 就 Go Router 而言,下面的 Flutter Navigator 相当于什么?
Navigator.pushNamed(
context,
Routes.CHANNEL_PAGE,
arguments:ChannelPageArgs(
channel:channel,
initialMessage:message,
),
);
Run Code Online (Sandbox Code Playgroud)
通常 Go Router 基于路径中的参数。但上面的例子是基于对象而不是原始参数。
GoRoute(
path: '/profile/:id',
builder: (context, state) => ProfilePage(id: state.params['id']!),
),
Run Code Online (Sandbox Code Playgroud) flutter ×10
gorouter ×10
dart ×7
navigation ×2
deep-linking ×1
firebase ×1
flutter-web ×1
material-you ×1
riverpod ×1
routemaster ×1
routes ×1