Flutter正则表达式路由管理插件regex_router的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

Flutter正则表达式路由管理插件regex_router的使用

regex_router是一个支持正则路径匹配的Flutter路由管理插件。它允许开发者通过定义带有参数和查询字符串的复杂路由规则,简化了应用内页面导航的实现。

使用方法

首先需要创建一个RegexRouter实例,并将其generateRoute方法传递给MaterialApp或任何其他Navigator组件中。

示例代码

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

void main() {
  // 创建router实例
  final router = RegexRouter.create({
    "/": (context, _) => HomePage(),
    "/second/:id/": (context, args) => AnotherPage(id: args["id"]!),
    "/withBody": (context, args) => PageWithBody(body: args.body!),
    "/post/:id(\\?success=(?<success>true|false))?": (context, args) {
      bool success = args["success"] == "true";
      return PostResultPage(success: success);
    },
  });

  // 运行material app并配置router
  runApp(MaterialApp(
    onGenerateRoute: router.generateRoute,
    initialRoute: "/",
    theme: ThemeData(
      primarySwatch: Colors.blue,
    ),
  ));
}

class HomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Home Page')),
      body: Column(
        children: <Widget>[
          MaterialButton(
            onPressed: () => Navigator.of(context).pushNamed("/second/7"),
            child: Text("Go to Second Page with ID 7"),
          ),
          MaterialButton(
            onPressed: () => Navigator.of(context)
                .pushNamed("/withBody", arguments: {"key": "value"}),
            child: Text("Go to Page With Body"),
          ),
          MaterialButton(
            onPressed: () => Navigator.of(context)
                .pushNamed("/post/123?success=true"),
            child: Text("Check Post Result"),
          ),
        ],
      ),
    );
  }
}

class AnotherPage extends StatelessWidget {
  final String id;

  const AnotherPage({Key? key, required this.id}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Another Page')),
      body: Center(child: Text("ID: $id")),
    );
  }
}

class PageWithBody extends StatelessWidget {
  final Object body;

  const PageWithBody({Key? key, required this.body}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Page With Body')),
      body: Center(child: Text("Body: $body")),
    );
  }
}

class PostResultPage extends StatelessWidget {
  final bool success;

  const PostResultPage({Key? key, required this.success}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Post Result')),
      body: Center(child: Text("Success: $success")),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用regex_router插件进行正则表达式路由管理的示例代码。regex_router是一个强大的Flutter路由管理插件,允许你使用正则表达式来匹配和导航到不同的页面。

首先,确保你已经在pubspec.yaml文件中添加了regex_router依赖:

dependencies:
  flutter:
    sdk: flutter
  regex_router: ^最新版本号 # 请替换为实际最新版本号

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

接下来,我们设置一个简单的Flutter应用,演示如何使用regex_router

main.dart

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Regex Router Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      navigatorKey: RegexRouterDelegate.navigatorKey, // 设置navigatorKey
      onGenerateRoute: RegexRouter.generateRoute(routes: {
        r'^/$': (context) => HomePage(),
        r'^/about$': (context) => AboutPage(),
        r'^/user/(\d+)$': (context, match) => UserPage(userId: int.parse(match.group(1)!)),
      }),
    );
  }
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Page'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('You are on the Home Page'),
            ElevatedButton(
              onPressed: () => RegexRouter.of(context).navigateTo('/about'),
              child: Text('Go to About Page'),
            ),
            ElevatedButton(
              onPressed: () => RegexRouter.of(context).navigateTo('/user/123'),
              child: Text('Go to User Page (ID: 123)'),
            ),
          ],
        ),
      ),
    );
  }
}

class AboutPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('About Page'),
      ),
      body: Center(
        child: Text('You are on the About Page'),
      ),
    );
  }
}

class UserPage extends StatelessWidget {
  final int userId;

  UserPage({required this.userId});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('User Page'),
      ),
      body: Center(
        child: Text('You are on the User Page with ID: $userId'),
      ),
    );
  }
}

解释

  1. 依赖注入:在pubspec.yaml文件中添加regex_router依赖。
  2. MaterialApp设置:在MaterialApp中,设置navigatorKeyRegexRouterDelegate.navigatorKey,并定义路由生成函数onGenerateRoute
  3. 路由定义:使用正则表达式定义不同的路由路径:
    • /:匹配主页。
    • /about:匹配关于页面。
    • /user/(\d+):匹配用户页面,并捕获用户ID。
  4. 页面定义:定义了三个页面:HomePageAboutPageUserPage
  5. 导航:在HomePage中,使用RegexRouter.of(context).navigateTo(path)方法导航到不同的页面。

这个示例展示了如何使用regex_router插件进行基于正则表达式的路由管理。你可以根据实际需求扩展和修改这个示例。

回到顶部