Flutter路由管理插件route_tree_flutter的使用

发布于 1周前 作者 sinazl 来自 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

1 回复

更多关于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;
      },
    ),
  ],
);
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!