Flutter路由管理插件route_tree_flutter的使用
route_tree_flutter #
route_tree_flutter 是一个用于简化在 Flutter 应用中使用 route_tree
的工具。它提供了一个函数 makeRouteFactory
,可以简化路由配置,而无需向主包添加额外依赖。
示例代码
以下是一个完整的示例,展示如何使用 route_tree_flutter
来管理路由。
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:route_tree/parser.dart'; // 导入路由解析器
import 'package:route_tree/route_tree.dart'; // 导入路由树库
import 'package:route_tree_flutter/route_tree_flutter.dart'; // 导入路由树 Flutter 插件
// 主应用入口
void main() => runApp(FlutterRouteTreeExampleApp());
// 自定义应用组件
class FlutterRouteTreeExampleApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'route_tree 示例',
theme: ThemeData(primarySwatch: Colors.blue), // 设置主题颜色
initialRoute: "/", // 初始路由
onGenerateRoute: makeRouteFactory<dynamic>(
// 使用 makeRouteFactory 配置路由
pageRouteBuilder: (widget, settings) => MaterialPageRoute<dynamic>(
// 定义页面路由生成器
builder: (context) => widget,
settings: settings,
),
createAnonymousRoute: () => const NoScreenFoundScreen(), // 未找到路由时的默认页面
routeTree: Segment.root<Widget>( // 根路由配置
create: (context) => const HomeScreen(), // 默认首页
createError: (context) => NoScreenFoundScreen(uri: context.uri), // 路由错误处理
children: [
Segment.path( // 第一级路径配置
name: "users", // 路径名称
create: (context) => const ListUsersScreen(), // 用户列表页
children: [
Segment.param( // 带参数的子路径配置
parser: const UintParser("userId"), // 参数解析器
create: (context) => UserDetailScreen(id: context["userId"] as int), // 用户详情页
),
],
),
],
),
),
);
}
}
// 首页组件
class HomeScreen extends StatelessWidget {
const HomeScreen();
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
body: ListView(
children: [
ListTile(
title: const Text("用户 ID 列表"),
onTap: () => Navigator.of(context).pushNamed("/users"), // 导航到用户列表页
),
],
),
);
}
}
// 用户列表页组件
class ListUsersScreen extends StatelessWidget {
const ListUsersScreen();
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
body: ListView.builder(
itemCount: 10, // 模拟 10 个用户
itemBuilder: (context, i) => ListTile(
title: Text("用户 $i"),
onTap: () => Navigator.of(context).pushNamed("/users/$i"), // 导航到用户详情页
),
),
);
}
}
// 用户详情页组件
class UserDetailScreen extends StatelessWidget {
const UserDetailScreen({required this.id});
final int id;
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text("用户详情页,ID: $id"), // 显示用户 ID
),
);
}
}
// 未找到路由时的默认页面
class NoScreenFoundScreen extends StatelessWidget {
const NoScreenFoundScreen({this.uri});
final Uri? uri;
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text("未找到路由: $uri"), // 显示未找到的路由
),
);
}
}
更多关于Flutter路由管理插件route_tree_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter路由管理插件route_tree_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
route_tree_flutter
是一个用于 Flutter 应用的路由管理插件,它可以帮助你更好地组织和管理应用中的路由。通过使用 route_tree_flutter
,你可以将路由组织成树形结构,从而更清晰地管理页面之间的跳转关系。
安装
首先,你需要在 pubspec.yaml
文件中添加 route_tree_flutter
依赖:
dependencies:
flutter:
sdk: flutter
route_tree_flutter: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
基本使用
1. 创建路由树
首先,你需要定义一个路由树。路由树是由 RouteNode
组成的树形结构,每个 RouteNode
代表一个页面。
import 'package:route_tree_flutter/route_tree_flutter.dart';
final RouteNode root = RouteNode(
path: '/',
builder: (context) => HomePage(),
children: [
RouteNode(
path: '/details',
builder: (context) => DetailsPage(),
),
RouteNode(
path: '/settings',
builder: (context) => SettingsPage(),
),
],
);
在这个例子中,root
是路由树的根节点,它有三个子节点:/details
和 /settings
。
2. 配置路由
接下来,你需要在 MaterialApp
中配置路由。你可以使用 RouteTree
来生成 onGenerateRoute
函数。
import 'package:flutter/material.dart';
import 'package:route_tree_flutter/route_tree_flutter.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Route Tree Flutter Demo',
onGenerateRoute: RouteTree.generateRoute(root),
initialRoute: '/',
);
}
}
3. 页面跳转
你可以使用 Navigator.pushNamed
来进行页面跳转。
Navigator.pushNamed(context, '/details');
高级用法
1. 参数传递
你可以在跳转时传递参数,并在页面中获取这些参数。
// 定义路由节点
final RouteNode root = RouteNode(
path: '/',
builder: (context) => HomePage(),
children: [
RouteNode(
path: '/details/:id',
builder: (context) => DetailsPage(),
),
],
);
// 跳转时传递参数
Navigator.pushNamed(context, '/details/123');
// 在页面中获取参数
class DetailsPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final String id = RouteTree.of(context).params['id'];
return Scaffold(
appBar: AppBar(
title: Text('Details Page'),
),
body: Center(
child: Text('ID: $id'),
),
);
}
}
2. 嵌套路由
你可以在路由树中定义嵌套路由,以支持嵌套导航。
final RouteNode root = RouteNode(
path: '/',
builder: (context) => HomePage(),
children: [
RouteNode(
path: '/profile',
builder: (context) => ProfilePage(),
children: [
RouteNode(
path: '/profile/settings',
builder: (context) => ProfileSettingsPage(),
),
],
),
],
);
3. 路由守卫
你可以为路由节点添加路由守卫,以控制页面跳转的权限。
final RouteNode root = RouteNode(
path: '/',
builder: (context) => HomePage(),
children: [
RouteNode(
path: '/admin',
builder: (context) => AdminPage(),
guard: (context) {
// 检查用户是否有权限访问
if (!isAdmin) {
return '/login';
}
return null;
},
),
],
);