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

插件详情v0.7.1

flutter_redux_navigation

Flutter 的 redux 库的简单响应式导航中间件。

AndroidiOSWebmacOSWindowsLinux
近 30 天下载
443
喜欢数
13
Pub 分数
160

安装插件

flutter pub add flutter_redux_navigation

插件介绍

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

一个轻量级中间件,通过 Redux 在 Flutter 应用中实现响应式导航。它将导航状态与 Redux 存储同步,使路由能够根据应用状态变化以声明式和响应式的方式进行管理。该包通过将导航逻辑集成到 Redux 流程中,简化了导航逻辑,减少了样板代码并提高了可测试性。它支持所有主要平台,并能与 Flutter 的 Redux 生态系统无缝协作。

适合场景

  • 声明式路由管理
  • 基于状态的响应式导航
  • 跨组件的同步导航
  • 测试导航逻辑
  • 简化状态驱动的路由

主要特点

  • 与 Redux 存储集成
  • 响应式路由更新
  • 最小化样板代码
  • 跨平台支持
  • 轻松测试
  • 状态驱动的导航

适合对象

  • 基于 Redux 的 Flutter 应用
  • 需要状态依赖导航的应用
  • 寻求清晰导航模式的开发者
  • 使用反应式状态管理的 Teams
  • 需要可预测导航流程的项目

使用建议

  • 需要 Redux 设置
  • 仅限 Redux 架构
  • 可能为简单应用增加复杂性
  • 不适用于非 Redux 项目
  • 导航需要仔细的状态设计

原始 README

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

Build Status codecov

Flutter Navigation for redux

Navigation Middleware for Flutter's redux library.

Basic classes that enables page navigation through by utilizing Redux Store middleware facility.

This package is built to work with Redux.dart 4.0.0+.

Redux Middleware

  • NavigationMiddleware<T> - The Middleware that reacts to NavigateToActions.

Examples

Take a look in the examples directory.

How to setup navigation

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

class AppState {
  final String name;
  
  const AppState(this.name);
  
  factory AppState.initial() => AppState(null);
  factory AppState.changeName(String name) => AppState(name);
}

class AppNameChangedAction {
  final String name;

  AppNameChangedAction(this.name);
}

AppState _onAppNameChanged(AppState state, AppNameChangedAction action) =>
    state.changeName(action.name);

final appReducer = combineReducers<AppState>([
  TypedReducer<AppState, AppNameChangedAction>(_onAppNameChanged),
]);


final store = new Store<AppState>(combineReducers<AppState>([appReducer]),
    initialState: AppState.initial(),
    middleware: [
      NavigationMiddleware<AppState>(),
    ]);

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StoreProvider<AppState>(
        store: store,
        child: MaterialApp(
          title: 'My App',
          navigatorKey: NavigatorHolder.navigatorKey,
        )
    );
  }
}

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

How to navigate

Let's say you wish to navigate from a LoginPage to some dashboard page, you only need to dispatch a NavigateToAction.replace action with the appropriate path, which is registered to the dashboard page.

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

class LoginPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => LoginPageState();
}

class LoginPageState extends State<LoginPage> {
  @override
  Widget build(BuildContext context) {
    return StoreConnector<AppState, AuthBloc>(
      converter: (store) {
        return store;
      },
      builder: (BuildContext context, Store<AppState> store) {
        return Scaffold(body: Builder(
          builder: (BuildContext context) {
            return Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                RaisedButton(
                onPressed: () {
                  store.dispatch(NavigateToAction.replace('/dashboard'));
                },
                child: Text('Login'),
              )
              ],
            );
          },
        ));
      },
    );
  }
}

How to use pre and post navigation hooks

Let's use the same example as before, but now let's assume that you want to start a loader whilst navigating to the dashboard and stop it once you have navigated.

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

class LoginPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => LoginPageState();
}

class LoginPageState extends State<LoginPage> {
  @override
  Widget build(BuildContext context) {
    return StoreConnector<AppState, AuthBloc>(
      converter: (store) {
        return store;
      },
      builder: (BuildContext context, Store<AppState> store) {
        return Scaffold(body: Builder(
          builder: (BuildContext context) {
            return Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                RaisedButton(
                onPressed: () {
                  store.dispatch(
                    NavigateToAction.replace(
                      '/dashboard',
                      preNavigation: () => store.dispatch(StartLoadingAction()),
                      postNavigation: () => store.dispatch(StopLoadingAction()),
                    ),
                  );
                },
                child: Text('Login'),
              )
              ],
            );
          },
        ));
      },
    );
  }
}

所属分类

依赖

依赖清单 1 项

源码仓库

使用此插件的项目