Flutter路由管理插件angel_route的使用

Flutter路由管理插件angel_route的使用

angel_route 是一个强大的路由管理库,适用于Dart语言。它提供了类似于树形结构的路由系统,可以轻松导航,并且支持多种参数解析。无论是在服务器端还是客户端(如Flutter),都可以使用它来管理路由。

特性

  • 支持树形路由结构。
  • 提供参数解析功能(支持 int, double, 和 num)。
  • 不依赖于特定框架,可以在任何应用中使用。
  • 支持浏览器中的路由变化监听。

安装

pubspec.yaml 文件中添加以下依赖:

dependencies:
  angel_route: ^1.0.0

然后运行 flutter pub get 来安装依赖。


基本使用

1. 路由定义

我们可以使用 Router 来定义路由。以下是一个简单的示例:

import 'package:angel_route/angel_route.dart';

void main() {
  final router = Router();

  // 定义GET路由
  router.get('/home', () {
    return '欢迎来到首页!';
  });

  // 定义带有参数的路由
  router.get('/user/:id', (String id) {
    return '用户ID: $id';
  });

  // 自动解析参数类型
  router.get('/square_root/:id([0-9]+)', (int n) {
    return {'result': pow(n, 0.5)};
  });

  // 分组路由
  router.group('/admin', (router) {
    router.get('/settings', () {
      return '这是管理员设置页面。';
    });
  });

  // 启动监听
  router.listen();
}

代码说明:

  • router.get() 定义了一个 GET 请求的路由。
  • router.group() 可以将多个路由分组,方便管理。
  • 参数可以通过正则表达式限制格式(如 :id([0-9]+) 表示只接受数字)。

2. 路由解析

angel_route 提供了 resolve 方法来解析路径并获取路由信息:

void main() {
  final router = Router();

  router.get('/about', () {
    return '关于我们页面。';
  });

  // 解析路径
  var result = router.resolve('/about');
  print(result.first.allParams); // 输出 {}
  print(result.first.route.path); // 输出 '/about'
}

代码说明:

  • resolve 返回一个 RoutingResult 列表,包含匹配的路由信息。
  • allParams 是一个 Map,存储了所有路由参数。

3. 在Flutter中的使用

在Flutter应用中,我们可以结合 BrowserRouter 来监听路由变化:

import 'package:flutter/material.dart';
import 'package:angel_route/angel_route.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final router = BrowserRouter();

  @override
  void initState() {
    super.initState();

    // 监听路由变化
    router.onRoute.listen((route) {
      if (route != null) {
        print('当前路由: ${route.route.path}');
      } else {
        print('未找到匹配的路由');
      }
    });

    // 开始监听
    router.listen();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('angel_route 示例')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                router.navigate('/home');
              },
              child: Text('跳转到 /home'),
            ),
            ElevatedButton(
              onPressed: () {
                router.navigate('/about');
              },
              child: Text('跳转到 /about'),
            ),
          ],
        ),
      ),
    );
  }
}

代码说明:

  • 使用 BrowserRouter 替换 Router,以便在Flutter中使用。
  • navigate 方法用于手动触发路由跳转。
  • onRoute 可以监听路由变化并执行相应逻辑。

高级用法

1. 路由分组与中间件

我们可以通过 group 方法对路由进行分组,并添加中间件:

router.group('/api', (router) {
  router.use((req, res, next) {
    print('API请求开始');
    next();
  });

  router.get('/users', () {
    return '这是用户列表。';
  });
});

2. 动态路由参数

支持动态参数解析,并限制参数格式:

router.get('/product/:id([0-9]+)', (int id) {
  return '产品ID: $id';
});

更多关于Flutter路由管理插件angel_route的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter路由管理插件angel_route的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


angel_route 是一个用于 Flutter 应用的路由管理插件,它提供了灵活且强大的路由管理功能。虽然 angel_route 最初是为 Angel 框架设计的,但它也可以用于 Flutter 应用中。以下是如何在 Flutter 项目中使用 angel_route 的基本步骤。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 angel_route 依赖:

dependencies:
  flutter:
    sdk: flutter
  angel_route: ^3.0.0

然后运行 flutter pub get 来获取依赖。

2. 创建路由

接下来,你可以使用 angel_route 来定义你的路由。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:angel_route/angel_route.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  final Router router = Router();

  MyApp() {
    // 定义路由
    router.get('/', (req, res) => HomePage());
    router.get('/about', (req, res) => AboutPage());
    router.get('/user/:id', (req, res) => UserPage(id: req.params['id']));
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomePage(),
      onGenerateRoute: (settings) {
        // 使用 angel_route 处理路由
        var match = router.match(settings.name, method: 'GET');
        if (match != null) {
          return MaterialPageRoute(
            builder: (context) => match.handler(null, null),
          );
        }
        return null;
      },
    );
  }
}

class HomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.pushNamed(context, '/about');
          },
          child: Text('Go to About'),
        ),
      ),
    );
  }
}

class AboutPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('About'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: Text('Go back'),
        ),
      ),
    );
  }
}

class UserPage extends StatelessWidget {
  final String id;

  UserPage({required this.id});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('User $id'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: Text('Go back'),
        ),
      ),
    );
  }
}
回到顶部