Flutter路由管理插件nuvigator的使用
Flutter路由管理插件nuvigator的使用
Nuvigator
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
更多关于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
在 MaterialApp 或 CupertinoApp 中,使用 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(),
),
),
],
),
);
}
}

