Flutter自动化路由生成插件flutter_navigation_generator的使用

Flutter自动化路由生成插件flutter_navigation_generator的使用

FlutterNavigationGenerator 是一个生成器,通过简单的注解为您的页面生成导航器。

功能特性

  • 生成带有所有路由(@flutterRoute, @flutterDialog@flutterBottomSheet)的导航器类。
  • 类型安全的导航方法。
  • 使用 GlobalKey 进行导航,因此您可以创建多个嵌套导航器而不需要上下文。
  • 使用原生 Flutter 导航(无第三方依赖)。
  • 支持 Web,具有自动编码和解码路由参数的功能。

入门指南

首先添加依赖项:

dependencies:
  flutter_navigation_generator_annotations: current_version
  flutter_navigation_generator_animations: current_version # 可选,用于路由动画

dev_dependencies:
  flutter_navigation_generator: current_version

创建一个导航器文件,并在其中用 @flutterNavigator 注解类:

@flutterNavigator
class MainNavigator with BaseNavigator {}

然后用 [@flutterRoute](/user/flutterRoute) 注解您的页面:

[@flutterRoute](/user/flutterRoute)
class FirstPage extends StatefulWidget {
  const FirstPage({super.key});
  ...
}

运行 build runner 并可以开始使用导航器:

// 在您的依赖注入中:
final myNavigator = MainNavigator();

...

MaterialApp(
  key: myNavigator.navigatorKey,
  onGenerateRoute: myNavigator.onGenerateRoute,
  initialRoute: RouteNames.myHomePage,
),

...

myNavigator.goToSecondPage();

自定义

FlutterNavigator
  • navigatorClassName: 导航器类的名称。默认值:BaseNavigator
  • pageType: 生成页面的类型,必须扩展 [PageRoute]。默认值:MaterialPageRoute
  • removeSuffixes: 要从路由名称中移除的后缀列表。默认值:['Page', 'Screen', 'View', 'Widget']
  • unknownRoute: 当找不到路由时使用的屏幕,类似于 Web 上的 404 页面
  • defaultGuards: 将这些守卫添加到所有未指定守卫的路由。可用于添加登录守卫等
FlutterRoute
  • routeName: 路由名称。可选地使用 :name 声明路由中的参数以供 Web 使用
  • methodName: 方法的名称。默认值:goTo[ClassName]
  • returnType: 路由的返回类型。默认值:void
  • navigationType: 导航类型。默认值:NavigationType.push
  • generateMethod: 是否为该路由生成方法。默认值:true
  • generatePage: 是否为该路由生成页面。默认值:true
  • isFullscreenDialog: 路由是否应全屏显示。默认值:false

示例代码:

[@FlutterRoute](/user/FlutterRoute)(
  routeName: 'custom-name',
  returnType: bool,
  navigationType: NavigationType.popAndPush,
)
class FirstPage extends StatelessWidget {
    final int someValue;
    final int someOtherValue;

    const FirstPage({required this.someValue, this.someOtherValue = 1, super.key});

    @flutterRouteConstructor
    static FirstPage doubleValue(int someValue, {Key? key, int someOtherValue = 2}) => FirstPage(someValue: someValue * 2, key: key, someOtherValue: someOtherValue);
}

完整示例 Demo

以下是一个完整的示例 Demo:

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

Future<void> main() async {
  runApp(const MyApp());
}

final mainNavigator = MainNavigator();

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      onGenerateRoute: mainNavigator.onGenerateRoute,
      navigatorKey: mainNavigator.navigatorKey,
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

[@FlutterRoute](/user/FlutterRoute)(routeName: '/')
class MyHomePage extends StatefulWidget {
  const MyHomePage({this.title, super.key});

  final String? title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: widget.title == null ? null : AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title!),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () => mainNavigator.goToSecondPage(),
          child: const Text("Go to Second Page"),
        ),
      ),
    );
  }
}

[@FlutterRoute](/user/FlutterRoute)(returnType: bool)
class SecondPage extends StatelessWidget {
  const SecondPage({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: const Text('second page'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () => mainNavigator.goBackWithResult(result: true),
          child: const Text("Return True"),
        ),
      ),
    );
  }
}

更多关于Flutter自动化路由生成插件flutter_navigation_generator的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自动化路由生成插件flutter_navigation_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 flutter_navigation_generator 插件进行 Flutter 自动化路由生成的代码案例。flutter_navigation_generator 插件可以自动生成路由代码,从而简化路由管理。

步骤一:添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_navigation_generator: ^x.y.z  # 请替换为最新版本号

dev_dependencies:
  build_runner: ^x.y.z  # 请确保使用兼容版本

步骤二:配置路由文件

创建一个 routes.dart 文件,定义你的路由信息。例如:

// routes.dart
import 'package:flutter/material.dart';
import 'package:flutter_navigation_generator/flutter_navigation_generator.dart';

part 'routes.g.dart'; // 自动生成的代码将会放在这个文件里

@GN(
  routes: [
    GNRoute(page: HomePage, name: '/home'),
    GNRoute(page: DetailsPage, name: '/details/:id'),
  ],
)
class MyRouter {}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Home')),
      body: Center(child: Text('Home Page')),
    );
  }
}

class DetailsPage extends StatelessWidget {
  final String id;

  DetailsPage({required this.id});

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

步骤三:生成路由代码

在终端中运行以下命令以生成路由代码:

flutter pub run build_runner build

这将在你的项目目录中生成一个 routes.g.dart 文件,其中包含了基于你在 routes.dart 文件中定义的路由生成的代码。

步骤四:使用生成的路由

在你的主文件中(例如 main.dart),使用生成的路由代码进行导航。例如:

import 'package:flutter/material.dart';
import 'routes.dart'; // 导入生成的路由文件

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      navigatorKey: MyRouter.navigatorKey, // 设置全局的navigatorKey
      onGenerateRoute: MyRouter.onGenerateRoute, // 使用生成的onGenerateRoute方法
    );
  }
}

// 示例:导航到主页和详情页
void navigateToHome(BuildContext context) {
  Navigator.of(context).pushNamed('/home');
}

void navigateToDetails(BuildContext context, String id) {
  Navigator.of(context).pushNamed('/details/$id');
}

示例使用

在你的 UI 中添加按钮来触发导航:

class ExamplePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Example')),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          ElevatedButton(
            onPressed: () => navigateToHome(context),
            child: Text('Go to Home'),
          ),
          ElevatedButton(
            onPressed: () => navigateToDetails(context, '123'),
            child: Text('Go to Details'),
          ),
        ],
      ),
    );
  }
}

这样,你就成功配置了 flutter_navigation_generator 插件,并通过它自动生成了路由代码,简化了路由管理。

回到顶部