Flutter路由管理插件hi_router的使用
Flutter路由管理插件hi_router的使用
什么是hi_router
系统自带的导航页面管理和路由管理并不统一,而hi_router将两者统一起来,并通过路由管理整个应用程序界面。
特性
- 统一路由和导航管理。
- 支持动态路由注册。
- 提供路由守卫功能。
- 支持404页面配置。
安装
在pubspec.yaml
文件中添加以下依赖:
$ flutter pub add hi_router
通过路由管理页面
使用示例
以下是一个完整的示例代码,展示了如何使用hi_router
来管理页面路由。
import 'package:flutter/material.dart';
import 'package:hi_router/hi_router.dart';
import 'package:hi_router/route/route_abstract.dart';
void main() {
runApp(App());
}
// 定义主应用
class App extends StatefulWidget {
[@override](/user/override)
State<StatefulWidget> createState() => _AppState();
}
// 主页
class HomePage extends Page {
[@override](/user/override)
Route createRoute(BuildContext context) {
return MaterialPageRoute(
settings: this,
builder: (BuildContext context) {
return _HomePageState();
},
);
}
}
// 主页状态
class _HomePageState extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Container(
child: Column(
children: [
// 跳转到登录页按钮
MaterialButton(
onPressed: () {
print("Jump to login page.");
RoutePath.getAppPathInstance().push('/login');
},
child: Text("login page"),
),
],
),
));
}
}
// 登录页
class LoginPage extends Page {
[@override](/user/override)
Route createRoute(BuildContext context) {
return MaterialPageRoute(
settings: this,
builder: (BuildContext context) {
return _LoginPageState();
},
);
}
}
// 登录页状态
class _LoginPageState extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Center(
child: Column(
children: [
const Text("Login page."),
// 跳转到未知页面
TextButton(
onPressed: () {
RoutePath.getAppPathInstance().push('/34343');
},
child: Text("404"))
],
)),
);
}
}
// 未知页面
class UnknownPage extends Page {
[@override](/user/override)
Route createRoute(BuildContext context) {
return MaterialPageRoute(
settings: this,
builder: (BuildContext context) {
return const UnknownPageRender();
},
);
}
}
// 未知页面渲染
class UnknownPageRender extends StatefulWidget {
const UnknownPageRender({Key? key}) : super(key: key);
[@override](/user/override)
State<UnknownPageRender> createState() => _UnknownPageRenderState();
}
class _UnknownPageRenderState extends State<UnknownPageRender> {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: const Center(
child: Text('Unknown page.'),
));
}
}
// 路由路径管理
class RoutePath {
static HiRouter? _appRoutePathInstance;
static HiRouter getAppPathInstance() {
_appRoutePathInstance ??= HiRouter({
'/': () => HomePage(), // 主页路由
'/login': () => LoginPage(), // 登录页路由
});
// 声明未匹配到的路由时展示的页面
_appRoutePathInstance!.registerUnknownPage =
RoutePageInfo('/404', () => UnknownPage());
// 路由守卫
_appRoutePathInstance!.before = (RoutePageInfo pageInfo) async {
return pageInfo;
};
return _appRoutePathInstance!;
}
}
// 主应用状态
class _AppState extends State<App> {
[@override](/user/override)
Widget build(BuildContext context) {
return RoutePath.getAppPathInstance().build(context, 'App title.');
}
}
1 回复
更多关于Flutter路由管理插件hi_router的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
hi_router
是一个用于 Flutter 应用的路由管理插件,它可以帮助开发者更方便地管理和跳转页面。以下是如何使用 hi_router
的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 hi_router
的依赖:
dependencies:
flutter:
sdk: flutter
hi_router: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 初始化路由
在你的 main.dart
文件中,初始化 hi_router
并配置路由:
import 'package:flutter/material.dart';
import 'package:hi_router/hi_router.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'HiRouter Example',
// 使用 HiRouter 的 onGenerateRoute 来管理路由
onGenerateRoute: HiRouter.onGenerateRoute,
initialRoute: '/',
);
}
}
3. 定义路由
在 HiRouter
中定义你的路由。你可以创建一个单独的文件来管理路由,例如 routes.dart
:
import 'package:hi_router/hi_router.dart';
import 'package:flutter/material.dart';
import 'home_page.dart';
import 'detail_page.dart';
class Routes {
static const String home = '/';
static const String detail = '/detail';
static final Map<String, HiRoute> routes = {
home: HiRoute(
builder: (context, parameters) => HomePage(),
),
detail: HiRoute(
builder: (context, parameters) => DetailPage(id: parameters['id']),
),
};
}
4. 配置路由
在 main.dart
中配置路由:
import 'package:flutter/material.dart';
import 'package:hi_router/hi_router.dart';
import 'routes.dart';
void main() {
HiRouter.configure(routes: Routes.routes);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'HiRouter Example',
onGenerateRoute: HiRouter.onGenerateRoute,
initialRoute: Routes.home,
);
}
}
5. 页面跳转
在应用中使用 HiRouter
进行页面跳转:
import 'package:flutter/material.dart';
import 'package:hi_router/hi_router.dart';
import 'routes.dart';
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home Page'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
// 跳转到详情页,并传递参数
HiRouter.pushNamed(context, Routes.detail, parameters: {'id': '123'});
},
child: Text('Go to Detail Page'),
),
),
);
}
}
6. 接收参数
在目标页面中接收传递的参数:
import 'package:flutter/material.dart';
class DetailPage extends StatelessWidget {
final String id;
DetailPage({required this.id});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Detail Page'),
),
body: Center(
child: Text('Detail ID: $id'),
),
);
}
}
7. 其他功能
hi_router
还支持其他功能,例如:
- 路由拦截:可以在跳转前进行拦截,例如检查用户是否登录。
- 路由回退:可以自定义回退逻辑。
- 路由动画:可以自定义页面跳转的动画效果。
8. 路由拦截示例
你可以在 HiRouter
中配置路由拦截器:
HiRouter.configure(
routes: Routes.routes,
routeInterceptor: (context, route, parameters) {
// 在这里进行拦截逻辑
if (route == Routes.detail) {
// 例如检查用户是否登录
bool isLoggedIn = checkIfUserIsLoggedIn();
if (!isLoggedIn) {
// 如果未登录,跳转到登录页
HiRouter.pushNamed(context, Routes.login);
return false; // 拦截跳转
}
}
return true; // 允许跳转
},
);
9. 路由动画示例
你可以自定义页面跳转的动画效果:
HiRouter.configure(
routes: Routes.routes,
transitionBuilder: (context, animation, secondaryAnimation, child) {
return SlideTransition(
position: Tween<Offset>(
begin: const Offset(1.0, 0.0),
end: Offset.zero,
).animate(animation),
child: child,
);
},
);