Flutter路由管理插件prism_flutter_go_router的使用

Flutter路由管理插件prism_flutter_go_router的使用

描述

prism_flutter_go_router 是一个为 Flutter 提供 go_router 实现的库。它属于 Flutter.Prism.Core 系列库的一部分。此库允许你构建模块化的应用程序,并且在保持模块隔离性和独立性的同时实现轻松导航。

特性

  • 易于集成 go_router:支持将 go_router 集成到项目中。
  • 支持常见的“标签页”应用:可以方便地处理具有多个标签页的应用场景。

开始使用

步骤 1:设置项目依赖

首先,在你的 pubspec.yaml 文件中添加以下依赖项:

dependencies:
  prism_flutter_go_router: ^版本号

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

步骤 2:继承 GoRouterBootstrapper

修改你的启动逻辑,使其继承自 GoRouterBootstrapper,并注册路由。

示例代码

void main() async {
  // 创建并运行 Bootstrapper
  final boostrapper = Bootstrapper();
  await boostrapper.run();
  runApp(child: const MyApp());
}

// 定义模块
class TestModule extends GetItModule {
  [@override](/user/override)
  Future<void> init(GetIt container) {
    // 获取 RegionManager 并注册视图
    final regionManager = container<RegionManager>();
    regionManager.registerView(
      "main",
      RegionWidgetRegistration(
        metadata: MultiChildMetadata("welcome", order: 1), // 设置元数据
        registration: (context) => const WelcomeWidget(), // 注册欢迎页面
      ),
    );
  }
}

// 自定义 Bootstrapper
class Bootstrapper extends GoRouterBootstrapper {
  [@override](/user/override)
  ModuleCatalog createModuleCatalog() {
    // 使用内存模块目录并添加模块
    final catalog = MemoryModuleCatalog();
    catalog.addModule(ModuleInfo((c) => TestModule()));
    return catalog;
  }
}

// 主 Widget
class MainWidget extends StatelessWidget {
  const MainWidget({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return RegionBuilder(
      regionManager: MyDI().instance.get<RegionManager>(), // 获取 RegionManager
      regionName: "main", // 指定区域名称
      multiChild: (children) => ListView(children: children), // 使用 ListView 显示子组件
    );
  }
}
1 回复

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


prism_flutter_go_router 是一个基于 go_router 的 Flutter 路由管理插件,旨在简化 Flutter 应用中的路由管理和导航。go_router 是 Flutter 官方推荐的路由管理库,提供了声明式的路由配置和强大的导航功能。

安装 prism_flutter_go_router

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

dependencies:
  flutter:
    sdk: flutter
  prism_flutter_go_router: ^1.0.0  # 请使用最新版本

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

基本使用

1. 配置路由

main.dart 文件中,你可以使用 prism_flutter_go_router 来配置路由。以下是一个简单的示例:

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

void main() {
  final GoRouter router = GoRouter(
    routes: [
      GoRoute(
        path: '/',
        builder: (BuildContext context, GoRouterState state) {
          return const HomeScreen();
        },
      ),
      GoRoute(
        path: '/details',
        builder: (BuildContext context, GoRouterState state) {
          return const DetailsScreen();
        },
      ),
    ],
  );

  runApp(MyApp(router: router));
}

class MyApp extends StatelessWidget {
  final GoRouter router;

  const MyApp({Key? key, required this.router}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      routerConfig: router,
    );
  }
}

class HomeScreen extends StatelessWidget {
  const HomeScreen({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Home')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            context.go('/details');
          },
          child: const Text('Go to Details'),
        ),
      ),
    );
  }
}

class DetailsScreen extends StatelessWidget {
  const DetailsScreen({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Details')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            context.go('/');
          },
          child: const Text('Go back to Home'),
        ),
      ),
    );
  }
}

2. 导航

prism_flutter_go_router 中,你可以使用 context.gocontext.push 来进行导航。

  • context.go:导航到指定路径,并替换当前路由栈。
  • context.push:导航到指定路径,并将新路由推入路由栈。
context.go('/details');  // 导航到详情页
context.push('/details');  // 推入详情页

3. 传递参数

你可以在导航时传递参数,并在目标页面中获取这些参数。

context.go('/details', extra: {'id': 123});

在目标页面中,你可以通过 state.extra 获取传递的参数:

class DetailsScreen extends StatelessWidget {
  const DetailsScreen({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final Map<String, dynamic>? args = GoRouterState.of(context).extra as Map<String, dynamic>?;
    final int id = args?['id'] ?? 0;

    return Scaffold(
      appBar: AppBar(title: const Text('Details')),
      body: Center(
        child: Text('Details for ID: $id'),
      ),
    );
  }
}

高级功能

1. 嵌套路由

go_router 支持嵌套路由,你可以在一个路由下定义子路由。

GoRoute(
  path: '/profile',
  builder: (BuildContext context, GoRouterState state) {
    return const ProfileScreen();
  },
  routes: [
    GoRoute(
      path: 'settings',
      builder: (BuildContext context, GoRouterState state) {
        return const SettingsScreen();
      },
    ),
  ],
);

2. 路由守卫

你可以使用 redirect 来实现路由守卫,控制用户是否可以访问某个路由。

GoRouter(
  routes: [
    GoRoute(
      path: '/',
      builder: (BuildContext context, GoRouterState state) {
        return const HomeScreen();
      },
    ),
    GoRoute(
      path: '/admin',
      builder: (BuildContext context, GoRouterState state) {
        return const AdminScreen();
      },
      redirect: (BuildContext context, GoRouterState state) {
        final bool isAdmin = checkIfAdmin();  // 自定义逻辑
        if (!isAdmin) {
          return '/';  // 重定向到首页
        }
        return null;  // 允许访问
      },
    ),
  ],
);
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!