Flutter路由管理插件nuvigator的使用

Flutter路由管理插件nuvigator的使用

Nuvigator

CircleCI
Pub

Routing and Navigation package.

如果您的英语不好?请阅读 README_PT


什么是Nuvigator?

Nuvigator 提供了一个强大的路由抽象层,覆盖了 Flutter 自带的 Navigator。通过一种声明式且简洁的方法来建模复杂的导航流程,无需担心许多棘手的行为,这些行为由 Nuvigator 为您处理。

Nuvigator 可以帮助您:

  • 大型/模块化应用:需要一个统一的 API 来注册路由并设计它们之间的关系。
  • 嵌套导航:在应用中创建嵌套/子级 Navigator,形成自包含的流程。
    • 在 Widget 树中处理导航,无需关心路由声明的位置。
    • 正确处理嵌套 Navigator 的弹出行为,能够透明地将弹出结果转发到调用方,并提供助手来处理嵌套导航。
    • 处理嵌套 Navigator 之间的 Hero 动画/过渡。
    • 正确处理嵌套 Navigator 中的 Android 返回按钮。
    • 改进对带有 NuvigatorPageRoute 混入类的嵌套 PageRoute 的支持。
  • 使用深层链接:希望使用深层链接在应用内导航,并支持路径参数和查询参数。
  • 提供声明式的、易于使用的 API 来声明和组合路由。

对于 NEXT API 文档

点击这里查看

关注提供更灵活、更简单和动态的 API 来声明导航和路由。

对于 LEGACY API 文档

点击这里查看

基于静态类型方法和生成器的 API。它被认为是已弃用的,并最终会被移除。


快速开始

最简单的实现

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Nuvigator App',
      builder: Nuvigator.routes(
        initialRoute: 'home', // 初始路由
        routes: [
          NuRouteBuilder(path: 'home', builder: (_, __, ___) => HomeScreen()), // 定义路由
          NuRouteBuilder(path: 'second', builder: (_, __, ___) => SecondScreen()),
        ],
      ),
    );
  }
}

更完整的示例

首先,确保导入的是 nuvigator/next.dart 文件,而不是 nuvigator.dart

import 'package:nuvigator/next.dart'; // 导入 next 版本
import 'package:flutter/material.dart';

// 定义一个新的 NuRoute
class MyRoute extends NuRoute {
  [@override](/user/override)
  String get path => 'my-route'; // 路由路径

  [@override](/user/override)
  ScreenType get screenType => materialScreenType; // 使用 Material Screen 类型

  [@override](/user/override)
  Widget build(BuildContext context, NuRouteSettings settings) {
    return MyScreen(
      onClick: () => nuvigator.open('next-route'), // 点击事件打开下一个路由
    );
  }
}

// 定义你的 NuRouter
class MyRouter extends NuRouter {
  [@override](/user/override)
  String get initialRoute => 'my-route'; // 初始路由

  [@override](/user/override)
  List<NuRoute> get registerRoutes => [
    MyRoute(), // 注册路由
  ];
}

// 渲染组件
Widget build(BuildContext context) {
  return Nuvigator(
    router: MyRouter(), // 设置路由器
  );
}

示例代码

以下是一个完整的示例代码,展示如何使用 Nuvigator 进行路由管理。

import 'package:flutter/material.dart';
import 'package:nuvigator/next.dart';
import 'package:provider/provider.dart';
import 'samples/bloc/samples_bloc.dart';
import 'samples/modules/friend_request/bloc/friend_request_bloc.dart';
import 'samples/router.dart';

void main() => runApp(MyApp());

// 自定义 Navigator 观察者
class TestObserver extends NavigatorObserver {
  [@override](/user/override)
  void didPush(Route<dynamic> route, Route<dynamic> previousRoute) {
    print('didPush $route'); // 打印路由推送信息
  }

  [@override](/user/override)
  void didPop(Route<dynamic> route, Route<dynamic> previousRoute) {
    print('didPop $route'); // 打印路由弹出信息
  }

  [@override](/user/override)
  void didRemove(Route<dynamic> route, Route<dynamic> previousRoute) {
    print('didRemove $route'); // 打印路由移除信息
  }

  [@override](/user/override)
  void didReplace({Route<dynamic> newRoute, Route<dynamic> oldRoute}) {
    print('didReplace $oldRoute to $newRoute'); // 打印路由替换信息
  }
}

// 主应用
class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Nuvigator Example',
      theme: ThemeData(
        primarySwatch: Colors.deepPurple,
      ),
      builder: (_, __) => ChangeNotifierProvider<SamplesBloc>.value(
        value: SamplesBloc(), // 提供 Bloc 实例
        child: ChangeNotifierProvider.value(
          value: FriendRequestBloc(10), // 提供 FriendRequestBloc 实例
          child: Nuvigator(
            debug: true, // 开启调试模式
            router: MainAppRouter(), // 设置主路由
            navigatorObservers: [TestObserver()], // 添加自定义观察者
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


Nuvigator 是一个用于 Flutter 的路由管理插件,它基于 Navigator 2.0 构建,提供了更强大和灵活的路由管理功能。与传统的 Navigator 1.0 相比,Nuvigator 允许开发者更好地控制路由堆栈,并支持深层链接、嵌套导航等高级功能。

安装 Nuvigator

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

dependencies:
  flutter:
    sdk: flutter
  nuvigator: ^0.6.0

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

基本用法

1. 创建路由

Nuvigator 使用 NuvigatorRouter 来定义路由。你可以通过继承 NuvigatorRouter 来创建自定义路由。

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

class MyRouter extends NuvigatorRouter {
  [@override](/user/override)
  String get initialRoute => 'home';

  [@override](/user/override)
  Map<String, NuRoute> get registerRoutes => {
        'home': NuRouteBuilder(
          path: 'home',
          builder: (BuildContext context, NuRouteSettings settings) {
            return HomeScreen();
          },
        ),
        'details': NuRouteBuilder(
          path: 'details',
          builder: (BuildContext context, NuRouteSettings settings) {
            final args = settings.rawParameters;
            return DetailsScreen(id: args['id']);
          },
        ),
      };
}

2. 使用 Nuvigator

MaterialAppCupertinoApp 中,使用 Nuvigator 来管理路由。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Nuvigator Example',
      home: Nuvigator(
        router: MyRouter(),
      ),
    );
  }
}

3. 导航

Nuvigator 中,你可以使用 NuRouter.of(context) 来获取当前的 NuRouter 实例,并进行导航。

class HomeScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            final router = NuRouter.of(context);
            router.pushNamed('details', parameters: {'id': '123'});
          },
          child: Text('Go to Details'),
        ),
      ),
    );
  }
}

class DetailsScreen extends StatelessWidget {
  final String id;

  DetailsScreen({required this.id});

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

嵌套导航

Nuvigator 支持嵌套导航,可以在一个页面中嵌入另一个 Nuvigator 实例。

class NestedRouter extends NuvigatorRouter {
  [@override](/user/override)
  String get initialRoute => 'nestedHome';

  [@override](/user/override)
  Map<String, NuRoute> get registerRoutes => {
        'nestedHome': NuRouteBuilder(
          path: 'nestedHome',
          builder: (BuildContext context, NuRouteSettings settings) {
            return NestedHomeScreen();
          },
        ),
        'nestedDetails': NuRouteBuilder(
          path: 'nestedDetails',
          builder: (BuildContext context, NuRouteSettings settings) {
            final args = settings.rawParameters;
            return NestedDetailsScreen(id: args['id']);
          },
        ),
      };
}

class NestedHomeScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Nested Home'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            final router = NuRouter.of(context);
            router.pushNamed('nestedDetails', parameters: {'id': '456'});
          },
          child: Text('Go to Nested Details'),
        ),
      ),
    );
  }
}

class NestedDetailsScreen extends StatelessWidget {
  final String id;

  NestedDetailsScreen({required this.id});

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

在父路由中嵌入 Nuvigator

class HomeScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: Column(
        children: [
          ElevatedButton(
            onPressed: () {
              final router = NuRouter.of(context);
              router.pushNamed('details', parameters: {'id': '123'});
            },
            child: Text('Go to Details'),
          ),
          Expanded(
            child: Nuvigator(
              router: NestedRouter(),
            ),
          ),
        ],
      ),
    );
  }
}
回到顶部