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