Day 25 | Flutter 路由管理套件 - auto_route

Navigator 1.0

Flutter 有内建一个路由管理 API Navigator ,而Flutter也在今年发表了 Navigator 2.0 但因为工作上是使用 fluro 这个路由管理套件,所以就没特别研究了 Navigator 2.0,只能大概说明一下 Navigator 1.0

用起来算是很简单,我们可以直接用 Navigator.push 里面会就放我们要打开的新页面。

Navigator.push( 
      context,
      MaterialPageRoute(builder: (context) {
        return NewRoute();
      }),
    );

但为了方便管理通常都会使用命名路由的方式,然後将原本的 home: 换成 '/': (context) => const MyHomePage()

 MaterialApp(
      routes: {
        '/': (context) => const MyHomePage(),
        'users_list': (context) => const UsersListPage(),
      },
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
    );

如果要到另外一个页面就是使用 Navigator.pushNamed

Navigator.pushNamed(context, 'users_list');

但对於一些动态路由或者需要传参数的页面就会有点麻烦,所以大部分都会使用路由管理套件,虽然工作上是使用 fluro但架设起来也是有点庞大,所以就决定试玩一下另外一个套件 auto_route

auto_route

dependencies:
	auto_route: ^2.4.2
dev_dependencies:
	auto_route_generator: ^2.4.1

先建立另外一个档案 router.dart

import 'package:auto_route/auto_route.dart';
import 'package:flutter_rest_api_playground/view/users/users_detail_page.dart';
import 'package:flutter_rest_api_playground/view/users/users_list_page.dart';

import '../main.dart';

@MaterialAutoRouter(
  replaceInRouteName: 'Page,Route',
  routes: <AutoRoute>[
    AutoRoute(page: MyHomePage, path: '/', initial: true),
    AutoRoute(page: UsersListPage, path: '/users'),
    AutoRoute(page: UserDetailPage, path: '/user/:id'),
  ],
)
class $AppRouter {}

注册路由就是会用 AutoRoute 里面页面以及路由,首页的话就加上 initial: true ,而如果需要动态路由就可以 : 来标示,整体看起来跟网页很像。

replaceInRouteName 则是将我们的所注册的页面输出成另外一个名字避免混淆,这样让我们 push 时就会是使用 UsersListRoute 而不是 UsersListPage

因为auto_run会需要使用 codegen 所以一样要跑 build_runner。

使用时就将 MaterialApp 改为 MaterialApp.router ,然後实例化 AppRouter

class MyApp extends StatelessWidget {
  MyApp({Key? key}) : super(key: key);
  final _appRouter = AppRouter();

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

要导转页面时也算蛮简单的:

AutoRouter.of(context).pushNamed('/users');

AutoRouter.of(context).push(UsersListRoute());

可以选择要直接使用注册的 path 或者是 codegen出来的 xxxxxRoute

而需要接收参数的页面的宣告也很直观

class UserDetailPage extends StatefulWidget {
  const UserDetailPage({Key? key, @PathParam('id') required this.userId})
      : super(key: key);
  final String userId;
  @override
  State<UserDetailPage> createState() => _UserDetailPageState();
}

加上 @PathParam 即可, () 放我们在注册时的 : 的命名,所以以这个例子来说就是使用

@PathParam('id') 并把传给 userId

使用上就直接在字串中加入我们的变数或者使用 UserDetailRoute 里面传参数

AutoRouter.of(context).pushNamed('/user/${userInfo.id}');
AutoRouter.of(context).push(UserDetailRoute(userId: userInfo.id.toString()));

写到今天突然发现好像快没有东西可以写了, 明天可能会试着玩玩其他状态管理框架。


今天的程序码:
https://github.com/zxc469469/flutter_rest_api_playground/tree/Day25

参考资料:

  1. https://book.flutterchina.club/chapter2/flutter_router.html#_2-4-1-一个简单示例

<<:  Day 26 阿里云上运行Kubernetes 2 - ACK

>>:  Day23-介接 API(一)Google Calendar(I)启用 API 与 Events——Create

[Day3] 人脸侦测 (Face Detection)

小游戏,威利在哪里? (威利穿着红白条纹的衬衫并戴着一个绒球帽,手上拿着木制的手杖,还戴着一副眼镜...

Day18 - 如何在页面中预先载入其他的页面 (prefetch)

前言 在前面的章节已经介绍了 Next.js 是 file-based routing 的架构,在路...

MultiThreading and Custom extension function.

除了方便好用的 operator 之外,RxJava 还有一个非常重要的机制:非同步处理。 RxJa...

Day 30:「很刺眼,这样太亮了啦!」- 深色模式切换开关

「最近眼睛都一直盯着电脑,超酸的」 「而且这台萤幕还坏掉,不能调整亮度」 这样啊 ... 辛苦了,...

D3JsDay15 了解WEB地图学,先懂一点地理学—web地图的科学

GIS地理资讯系统(Geographic Information System) 地理资讯系统这个名...