Flutter导航管理插件fluent_navigation的使用

Flutter导航管理插件fluent_navigation的使用

fluent_navigation

fluent_navigation 是一个提供简单方式在应用内进行导航的包。

开始使用

添加依赖

pubspec.yaml 文件中添加 fluent_navigation 包的依赖:

dependencies:
  flutter:
    sdk: flutter
  fluent_navigation: ^1.1.0
创建页面

创建两个页面 PageOnePageTwoPageOne 是初始页面,包含两个按钮:一个用于推送至第二个页面,另一个用于导航到第二个页面。PageTwo 包含一个返回按钮,用于返回到前一个页面。

// Page one (初始页面)
class PageOne extends StatelessWidget {
  const PageOne({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("Page one")),
      body: Center(
        child: Column(
          children: [
            // 按钮用于推送至第二个页面
            ElevatedButton(
              onPressed: () async {
                // 推送到注册的路由 "two"
                final result = await Fluent.get<NavigationApi>().pushTo("two");
                if (result != null) {
                  debugPrint("Result: $result");
                }
              },
              child: const Text("推送到第二页"),
            ),
            const SizedBox(height: 16),
            // 按钮用于导航到第二个页面
            ElevatedButton(
              onPressed: () {
                // 导航到页面 "two"
                Fluent.get<NavigationApi>().navigateTo("two");
              },
              child: const Text("导航到第二页"),
            ),
          ],
        ),
      ),
    );
  }
}

// Page two
class PageTwo extends StatelessWidget {
  const PageTwo({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("Page two")),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 返回到前一个页面
            Fluent.get<NavigationApi>().pop(true);
          },
          child: const Text("返回到上一页"),
        ),
      ),
    );
  }
}
创建模块并注册路由

创建一个模块 ExampleModule 并注册两个路由:PageOnePageTwo

class ExampleModule extends FluentModule {
  [@override](/user/override)
  Future<void> build(Registry registry) async {
    registry
        // 初始路由
        ..registerRoute(GoRoute(
          name: "one",
          path: "/one",
          builder: (context, state) => const PageOne(),
        ))
        // 第二个路由
        ..registerRoute(GoRoute(
          name: "two",
          path: "/two",
          builder: (context, state) => const PageTwo(),
        ));
  }
}
构建模块

main.dart 中构建模块,并启动应用。

void main() async {
  await Fluent.build([
    NavigationModule(initialLocation: "/one"),
    ExampleModule(),
  ]);

  runApp(const MainApp());
}
使用它

MainApp 类中,获取路由配置并将其设置为 MaterialApp.routerrouterConfig

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 获取路由配置
    final router = Fluent.get<NavigationApi>().router;

    return MaterialApp.router(
      title: "Fluent Navigation Demo",
      routerConfig: router,
    );
  }
}

示例

完整示例代码

import 'package:fluent_navigation_example/example_module.dart';
import 'package:flutter/material.dart';
import 'package:fluent_navigation/fluent_navigation.dart';

void main() async {
  await Fluent.build([
    NavigationModule(initialLocation: "/one"),
    ExampleModule(),
  ]);

  runApp(const MainApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 获取路由配置
    final router = Fluent.get<NavigationApi>().router;

    return MaterialApp.router(
      title: "Fluent Navigation Demo",
      routerConfig: router,
    );
  }
}

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

1 回复

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


fluent_navigation 是一个为 Flutter 应用提供导航管理的插件,它帮助开发者更高效地管理和组织应用中的路由和导航逻辑。这个插件通常用于实现复杂的导航结构,尤其是当应用有多个嵌套路由或需要动态路由管理时。

以下是如何使用 fluent_navigation 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  fluent_navigation: ^0.1.0  # 请检查最新版本

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

2. 导入插件

在你的 Dart 文件中导入 fluent_navigation 插件:

import 'package:fluent_navigation/fluent_navigation.dart';

3. 设置导航管理器

fluent_navigation 提供了一个 NavigationManager 类来管理导航。你可以通过继承 NavigationManager 来创建你自己的导航管理器。

class MyNavigationManager extends NavigationManager {
  [@override](/user/override)
  void configureRoutes(RouteFactory router) {
    router('/', (context) => HomeScreen());
    router('/details', (context) => DetailsScreen());
    // 添加更多路由
  }

  [@override](/user/override)
  void configureNavigationBehavior(NavigationBehavior behavior) {
    behavior.setTransition(TransitionType.fade);
    // 配置其他导航行为
  }
}

4. 使用导航管理器

在你的 MaterialAppCupertinoApp 中使用 NavigationManager

void main() {
  final navigationManager = MyNavigationManager();

  runApp(MaterialApp(
    onGenerateRoute: navigationManager.router,
    navigatorObservers: [navigationManager.navigatorObserver],
    home: HomeScreen(),
  ));
}

5. 导航到不同页面

使用 NavigatorNavigationManager 提供的方法进行页面导航:

Navigator.pushNamed(context, '/details');

6. 处理导航事件

你可以在 NavigationManager 中处理导航事件,例如在页面切换时执行某些操作:

[@override](/user/override)
void onNavigate(RouteSettings settings) {
  print('Navigating to ${settings.name}');
}

7. 自定义导航行为

你可以通过配置 NavigationBehavior 来自定义导航行为,例如设置过渡动画、处理点击返回按钮的逻辑等。

[@override](/user/override)
void configureNavigationBehavior(NavigationBehavior behavior) {
  behavior.setTransition(TransitionType.slide);
  behavior.setOnBackPressed((context) {
    // 自定义返回按钮逻辑
    return true; // 返回 true 表示允许返回,false 表示阻止返回
  });
}

8. 嵌套导航

fluent_navigation 支持嵌套导航,你可以在不同的子路由管理器之间切换:

class SubNavigationManager extends NavigationManager {
  [@override](/user/override)
  void configureRoutes(RouteFactory router) {
    router('/sub/home', (context) => SubHomeScreen());
    router('/sub/details', (context) => SubDetailsScreen());
  }
}

// 在父导航管理器中切换子导航管理器
navigationManager.setSubManager(SubNavigationManager());

9. 监听导航状态

你可以通过 NavigatorObserver 监听导航状态的变化:

class MyNavigatorObserver extends NavigatorObserver {
  [@override](/user/override)
  void didPush(Route route, Route? previousRoute) {
    print('Pushed ${route.settings.name}');
  }

  [@override](/user/override)
  void didPop(Route route, Route? previousRoute) {
    print('Popped ${route.settings.name}');
  }
}

// 在 App 中注册 NavigatorObserver
navigatorObservers: [MyNavigatorObserver()],

10. 处理深链接

fluent_navigation 也支持处理深链接,你可以通过 onGenerateRoute 来解析和处理传入的深链接:

[@override](/user/override)
void configureRoutes(RouteFactory router) {
  router('/product/:id', (context) {
    final id = ModalRoute.of(context)!.settings.arguments as String;
    return ProductScreen(productId: id);
  });
}
回到顶部