B站视频
https://www.bilibili.com/vide...
本节目标
- 安装插件
- 路由定义
- 自动生成路由控制类
- 转场动画
- 登录检查中间件
- 带参数传递
- 获取返回值
正文
一些优秀的路由插件
- fluro
前端的使用体验
router.navigateTo(context, "/users/1234", transition: TransitionType.fadeIn);
- flutter_modular
功能强大的路由管理:中间件、懒加载、状态管理、动态路由、分组路由、动画、返回值、命名路由
- auto_route
设计精简、低耦合其它功能
功能:中间件、自动生成路由代码、动态路由、动画、返回值、命名路由
安装插件
- 官网
https://pub.flutter-io.cn/pac...
- pubspec.yaml
dependencies: flutter: sdk: flutter # 路由管理 auto_route: ^0.4.4dev_dependencies: flutter_test: sdk: flutter # 路由生成 auto_route_generator: ^0.4.4 build_runner:
路由定义
- lib/common/router/router.dart
@MaterialAutoRouter()class $AppRouter { @initial IndexPage indexPageRoute; WelcomePage welcomePageRoute; SignInPage signInPageRoute; SignUpPage signUpPageRoute; ApplicationPage applicationPageRoute; DetailsPage detailsPageRoute;}
注意 $
符号
自动生成路由控制类
- 执行命令
flutter packages pub run build_runner build
- 自动生成 lib/common/router/router.gr.dart
// GENERATED CODE - DO NOT MODIFY BY HAND// **************************************************************************// AutoRouteGenerator// **************************************************************************import 'package:flutter/material.dart';import 'package:flutter/cupertino.dart';import 'package:auto_route/auto_route.dart';import 'package:flutter_ducafecat_news/pages/index/index.dart';import 'package:flutter_ducafecat_news/pages/welcome/welcome.dart';import 'package:flutter_ducafecat_news/pages/sign_in/sign_in.dart';import 'package:flutter_ducafecat_news/pages/sign_up/sign_up.dart';import 'package:flutter_ducafecat_news/pages/application/application.dart';import 'package:flutter_ducafecat_news/common/router/auth_grard.dart';import 'package:flutter_ducafecat_news/pages/details/details.dart';abstract class Routes { static const indexPageRoute = '/'; static const welcomePageRoute = '/welcome-page-route'; static const signInPageRoute = '/sign-in-page-route'; static const signUpPageRoute = '/sign-up-page-route'; static const applicationPageRoute = '/application-page-route'; static const detailsPageRoute = '/details-page-route';}class AppRouter extends RouterBase { @override Map<String, List<Type>> get guardedRoutes => { Routes.applicationPageRoute: [AuthGuard], Routes.detailsPageRoute: [AuthGuard], }; //This will probably be removed in future versions //you should call ExtendedNavigator.ofRouter<Router>() directly static ExtendedNavigatorState get navigator => ExtendedNavigator.ofRouter<AppRouter>(); @override Route<dynamic> onGenerateRoute(RouteSettings settings) { final args = settings.arguments; switch (settings.name) { case Routes.indexPageRoute: if (hasInvalidArgs<IndexPageArguments>(args)) { return misTypedArgsRoute<IndexPageArguments>(args); } final typedArgs = args as IndexPageArguments ?? IndexPageArguments(); return MaterialPageRoute<dynamic>( builder: (_) => IndexPage(key: typedArgs.key), settings: settings, ); case Routes.welcomePageRoute: if (hasInvalidArgs<WelcomePageArguments>(args)) { return misTypedArgsRoute<WelcomePageArguments>(args); } final typedArgs = args as WelcomePageArguments ?? WelcomePageArguments(); return MaterialPageRoute<dynamic>( builder: (_) => WelcomePage(key: typedArgs.key), settings: settings, ); case Routes.signInPageRoute: if (hasInvalidArgs<SignInPageArguments>(args)) { return misTypedArgsRoute<SignInPageArguments>(args); } final typedArgs = args as SignInPageArguments ?? SignInPageArguments(); return MaterialPageRoute<dynamic>( builder: (_) => SignInPage(key: typedArgs.key), settings: settings, ); case Routes.signUpPageRoute: if (hasInvalidArgs<SignUpPageArguments>(args)) { return misTypedArgsRoute<SignUpPageArguments>(args); } final typedArgs = args as SignUpPageArguments ?? SignUpPageArguments(); return MaterialPageRoute<dynamic>( builder: (_) => SignUpPage(key: typedArgs.key), settings: settings, ); case Routes.applicationPageRoute: if (hasInvalidArgs<ApplicationPageArguments>(args)) { return misTypedArgsRoute<ApplicationPageArguments>(args); } final typedArgs = args as ApplicationPageArguments ?? ApplicationPageArguments(); return MaterialPageRoute<dynamic>( builder: (_) => ApplicationPage(key: typedArgs.key), settings: settings, ); case Routes.detailsPageRoute: if (hasInvalidArgs<DetailsPageArguments>(args)) { return misTypedArgsRoute<DetailsPageArguments>(args); } final typedArgs = args as DetailsPageArguments ?? DetailsPageArguments(); return MaterialPageRoute<dynamic>( builder: (_) => DetailsPage(key: typedArgs.key), settings: settings, ); default: return unknownRoutePage(settings.name); } }}//**************************************************************************// Arguments holder classes//***************************************************************************//IndexPage arguments holder classclass IndexPageArguments { final Key key; IndexPageArguments({this.key});}//WelcomePage arguments holder classclass WelcomePageArguments { final Key key; WelcomePageArguments({this.key});}//SignInPage arguments holder classclass SignInPageArguments { final Key key; SignInPageArguments({this.key});}//SignUpPage arguments holder classclass SignUpPageArguments { final Key key; SignUpPageArguments({this.key});}//ApplicationPage arguments holder classclass ApplicationPageArguments { final Key key; ApplicationPageArguments({this.key});}//DetailsPage arguments holder classclass DetailsPageArguments { final Key key; DetailsPageArguments({this.key});}
路由跳转
- 方式 1:带 context 方式
ExtendedNavigator.of(context).pushNamed(Routes.signUpPageRoute);
- 方式 2:不带 context 方式
ExtendedNavigator.ofRouter<AppRouter>().pushNamed(Routes.signUpPageRoute);
- 方式 3:如果你只有一个导航
ExtenedNavigator.rootNavigator.pushNamed(Routes.signUpPageRoute);
转场动画
- lib/common/router/router.dart
Widget zoomInTransition(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) { // you get an animation object and a widget // make your own transition return ScaleTransition(scale: animation, child: child);}@MaterialAutoRouter()class $AppRouter { ... @CustomRoute(transitionsBuilder: zoomInTransition) ApplicationPage applicationPageRoute;}
- 重新生成
flutter packages pub run build_runner build
登录检查中间件
- 创建 lib/common/router/auth_grard.dart
import 'package:auto_route/auto_route.dart';import 'package:flutter_ducafecat_news/common/router/router.gr.dart';import 'package:flutter_ducafecat_news/common/utils/utils.dart';class AuthGuard extends RouteGuard { @override Future<bool> canNavigate(ExtendedNavigatorState navigator, String routeName, Object arguments) async { var isAuth = await isAuthenticated(); if (isAuth == false) { ExtendedNavigator.rootNavigator.pushNamed(Routes.signInPageRoute); } return isAuth; }}
- 注册 lib/main.dart
class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'ducafecat.tech', debugShowCheckedModeBanner: false, builder: ExtendedNavigator<AppRouter>( initialRoute: Routes.indexPageRoute, router: AppRouter(), guards: [AuthGuard()], ), ); }}
- 定义 lib/common/router/router.dart
@MaterialAutoRouter()class $AppRouter { ... @GuardedBy([AuthGuard]) @CustomRoute(transitionsBuilder: zoomInTransition) ApplicationPage applicationPageRoute;}
- 重新生成
flutter packages pub run build_runner build
参数传递
- 设定初始参数 lib/pages/details/details.dart
class DetailsPage extends StatefulWidget { final String cid; DetailsPage({Key key, this.cid}) : super(key: key);
- 定义 lib/common/router/router.dart
@MaterialAutoRouter(generateNavigationHelperExtension: true)class $AppRouter { ...
- 重新生成
flutter packages pub run build_runner build
- lib/common/router/router.gr.dart
//DetailsPage arguments holder classclass DetailsPageArguments { final Key key; final String cid; DetailsPageArguments({this.key, this.cid});}
- 导航参数
ExtendedNavigator.rootNavigator.pushDetailsPageRoute(cid: '123');
- 获取返回值
ExtendedNavigator.rootNavigator .pushNamed(Routes.signUpPageRoute) .then((onValue) { print(onValue); });
资源
视频
- b 站
- 油管镜像
蓝湖设计稿(加微信给授权 ducafecat)
https://lanhuapp.com/url/lYuz1
密码: gSKl
蓝湖现在收费了,所以查看标记还请自己上传 xd 设计稿
商业设计稿文件不好直接分享, 可以加微信联系 ducafecat
YAPI 接口管理
http://yapi.demo.qunar.com/
代码
https://github.com/ducafecat/...
参考
https://pub.flutter-io.cn/pac...
VSCode 插件
- Flutter、Dart
- Flutter Widget Snippets
- Awesome Flutter Snippets
- Paste JSON as Code
- bloc
- Code Spell Checker