搜索插件、代码仓与 APP 分类

插件详情v3.0.0

no_context_navigation

一个用于在屏幕(路由)之间导航而无需使用上下文(BuildContext)的 Flutter 包。

AndroidiOSWebmacOSWindowsLinux
近 30 天下载
845
喜欢数
20
Pub 分数
150

安装插件

flutter pub add no_context_navigation

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

no_context_navigation 包使 Flutter 开发人员能够在无需 BuildContext 的情况下在屏幕之间进行导航。这在上下文不可用的情况下特别有用,例如在异步操作期间或使用全局方法时。通过提供一个简单、静态的导航 API,它简化了应用程序中的路由管理。该包支持所有主要平台,包括 Android、iOS、Web、macOS、Windows 和 Linux,使其适用于跨平台应用。

适合场景

  • 从后台任务中导航
  • 全局错误处理程序
  • 异步回调
  • 状态管理集成
  • 应用初始化流程

主要特点

  • 无需BuildContext
  • 静态导航方法
  • 跨平台支持
  • 简单 API
  • 适用于任何状态管理

适合对象

  • 开发人员避免上下文依赖
  • 具有复杂状态逻辑的应用程序
  • 全局导航工具
  • 大规模的 Flutter 项目
  • 非小部件上下文导航

使用建议

  • 需要正确初始化
  • 如果未妥善管理,可能会绕过路由守卫
  • 不适用于特定小部件的导航
  • 仅限基本路由转换
  • 最好与路由配置一起使用

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

No Context Navigation

No Context Navigation Package - pub.dev

Instead of using Navigator.of(context).pushNamed or some other method like pop() or pushReplacementNamed() USING context. With this package you don't need to anymore.

This service use a GlobalKey of type NavigatorState which can be used across the entire applicaton.

Now, you only need to this:

navService.pushNamed('/detail_screen', args: 'From Home Screen');

But first, add the navigationKey to your MaterialApp's navigationKey property:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      //Over here
      navigatorKey: NavigationService.navigationKey,
      onGenerateRoute: (RouteSettings settings) {
        switch (settings.name) {
          case '/':
            return MaterialPageRoute(builder: (_) => HomeScreen());
          case '/detail_screen':
            return MaterialPageRoute(builder: (_) => DetailScreen(message: settings.arguments));
          default:
            return null;
        }
      },
    );
  }
}

Use navService object to be able to acess those methods:

import 'package:flutter/material.dart';

final NavigationService navService = NavigationService();

class NavigationService<T, U> {
  static GlobalKey<NavigatorState> navigationKey = GlobalKey<NavigatorState>();

  Future<T> pushNamed(String routeName, {Object args}) async =>
      navigationKey.currentState.pushNamed<T>(
        routeName,
        arguments: args,
      );

  Future<T> push(Route<T> route) async =>
      navigationKey.currentState.push<T>(route);

  Future<T> pushReplacementNamed(String routeName, {Object args}) async =>
      navigationKey.currentState.pushReplacementNamed<T, U>(
        routeName,
        arguments: args,
      );

  Future<T> pushNamedAndRemoveUntil(
    String routeName, {
    Object args,
    bool keepPreviousPages = false,
  }) async =>
      navigationKey.currentState.pushNamedAndRemoveUntil<T>(
        routeName,
        (Route<dynamic> route) => keepPreviousPages,
        arguments: args,
      );

  Future<T> pushAndRemoveUntil(
    Route<T> route, {
    bool keepPreviousPages = false,
  }) async =>
      navigationKey.currentState.pushAndRemoveUntil<T>(
        route,
        (Route<dynamic> route) => keepPreviousPages,
      );

  Future<bool> maybePop([Object args]) async =>
      navigationKey.currentState.maybePop<bool>(args);

  bool canPop() => navigationKey.currentState.canPop();

  void goBack({T result}) => navigationKey.currentState.pop<T>(result);
}

Hope you enjoy!

所属分类

源码仓库

使用此插件的项目

暂无相关数据。