redux 3.0.0

  • Installing
  • Versions
  • 95


Build Status

Redux for Dart using generics for typed State. It includes a rich ecosystem of Docs, Middleware, Dev Tools and can be combined with Flutter using the flutter_redux package.

Redux 3.0.0 Migration & Dart 2 support

In order to support Dart 2, some of the APIs needed to change. The good news: This actually simplifies Redux! The bad news: you may need to update your projects.

  • Change ReducerBinding to TypedReducer
  • Remove combineTypedReducer. Use combineReducers with a combination of normal reducers and/or TypedReducers.
  • Change MiddlewareBinding to TypedMiddleware.
  • Remove combineTypedMiddleware -- no longer needed! Just create a normal List<Middleware<State>>!


import 'package:redux/redux.dart';

// Create typed actions. You will dispatch these in order to
// update the state of your application.
enum Actions {

// Create a Reducer. A reducer is a pure function that takes the 
// current State (int) and the Action that was dispatched. It should
// combine the two into a new state without mutating the state passed
// in! After the state is updated, the store will emit the update to 
// the `onChange` stream.
// Because reducers are pure functions, they should not perform any 
// side-effects, such as making an HTTP request or logging messages
// to a console. For that, use Middleware.
int counterReducer(int state, action) {
  if (action == Actions.increment) {
    return state + 1;
  } else if (action == Actions.decrement) {
    return state - 1;
  return state;

// A piece of middleware that will log all actions with a timestamp
// to your console!
// Note, this is just an example of how to write your own Middleware.
// See the redux_logging package on pub for a pre-built logging 
// middleware.
loggingMiddleware(Store<int> store, action, NextDispatcher next) {
  print('${new}: $action');


main() {
  // Create the store with our Reducer and Middleware
  final store = new Store<int>(
    initialState: 0, 
    middleware: [loggingMiddleware],

  // Render our State right away
  // Listen to store changes, and re-render when the state is updated

  // Attach a click handler to a button. When clicked, the `INCREMENT` action
  // will be dispatched. It will then run through the reducer, updating the 
  // state.
  // After the state changes, the html will be re-rendered by our `onChange`
  // listener above. 
  querySelector('#increment').onClick.listen((_) {

render(int state) {
  querySelector('#value').innerHtml = '${state}';


  • Motivation and Principles - Learn why Redux might make sense for your app and the principles behind it.
  • Basics - Introduction to the core concepts in Redux
  • Combining Reducers - combineReducers works a bit differently in Dart than it does in JS. Learn why, and how to combine reducers in a type-safe way!
  • Async with Middleware - Learn how to make async calls, such as to a web service or local database, with Redux.
  • API Documentation - Rich documentation included in the source code and generated by DartDoc.

Flutter Examples

Web Examples

See the example/ directory for a few simple examples of the basics of Redux.

To launch the examples in your browser:

  1. Run pub serve example from this directory
  2. Open http://localhost:8080


  • redux_logging - Connects a Logger to a Store, and can print out actions as they're dispatched to your console.
  • redux_thunk - Allows you to dispatch functions that perform async work as actions.
  • redux_future - For handling Dart Futures that are dispatched as Actions.
  • redux_epics - Middleware that allows you to work with Dart Streams of Actions to perform async work.

Dev Tools

The redux_dev_tools library allows you to create a DevToolsStore during dev mode in place of a normal Redux Store.

This DevToolsStore will act exactly like a normal Store at first. However, it will also allow you to travel back and forth throughout the States of your app or recompute the State of your app by replaying all actions through your reducers. This works perfectly with Hot Reloading!

You can combine the DevToolsStore with your own UI to travel in time, or use one of the existing options for the platform you're working with:

Additional Utilities

  • reselect - Efficiently derive data from your Redux Store with memoized functions.


  • Dart 2 support
  • Remove ReducerBinding, use TypedReducer
  • Remove combineTypedReducer. Use combineReducers with normal reducers & TypedReducers.
  • Remove MiddlewareBinding, use TypedMiddleware.
  • Remove combineTypedMiddleware -- no longer needed! Just create a normal List<Middleware<State>>!


  • Ensure the repo is 100% healthy.


  • Add the distinct option. If set to true, the Store will not emit onChange events if the new State that is returned from your [reducer] in response to an Action is equal to the previous state. False by default.


  • Use absolute urls to fix broken links in documentation on Pub.


  • Add MOAR documentation


  • Add type-safe combineTypedReducers and combineTypedMiddleware functions


  • Add documentation highlighting the redux ecosystem


  • Breaking API Changes:
    • Reducer is now a typedef. Use ReducerClass<State> if you'd like to continue to use a class interface.
    • Middleware is now a typedef. Use MiddlewareClass<State> as a replacement for the old Middleware<State, Action>
    • A teardown method has been added. Use it to shut down the store in the middle of your application lifecycle if you no longer need the store.
  • Added more docs

Use this package as a library

1. Depend on it

Add this to your package's pubspec.yaml file:

  redux: ^3.0.0

2. Install it

You can install packages from the command line:

with pub:

$ pub get

with Flutter:

$ flutter packages get

Alternatively, your editor might support pub get or flutter packages get. Check the docs for your editor to learn more.

3. Import it

Now in your Dart code, you can use:

import 'package:redux/redux.dart';
Version Uploaded Documentation Archive
3.0.0 Mar 30, 2018 Go to the documentation of redux 3.0.0 Download redux 3.0.0 archive
2.1.1 Jan 3, 2018 Go to the documentation of redux 2.1.1 Download redux 2.1.1 archive
2.1.0 Dec 22, 2017 Go to the documentation of redux 2.1.0 Download redux 2.1.0 archive
2.0.4 Nov 29, 2017 Go to the documentation of redux 2.0.4 Download redux 2.0.4 archive
2.0.3 Nov 29, 2017 Go to the documentation of redux 2.0.3 Download redux 2.0.3 archive
2.0.2 Nov 4, 2017 Go to the documentation of redux 2.0.2 Download redux 2.0.2 archive
2.0.1 Sep 5, 2017 Go to the documentation of redux 2.0.1 Download redux 2.0.1 archive
2.0.0 Aug 25, 2017 Go to the documentation of redux 2.0.0 Download redux 2.0.0 archive
1.1.0 Sep 7, 2016 Go to the documentation of redux 1.1.0 Download redux 1.1.0 archive
1.0.0 May 17, 2016 Go to the documentation of redux 1.0.0 Download redux 1.0.0 archive
Describes how popular the package is relative to other packages. [more]
Code health derived from static analysis. [more]
Reflects how tidy and up-to-date the package is. [more]
Weighted score of the above. [more]
Learn more about scoring.

We analyzed this package on Dec 5, 2018, and provided a score, details, and suggestions below. Analysis was completed with status completed using:

  • Dart: 2.1.0
  • pana: 0.12.7


Detected platforms: Flutter, web, other

No platform restriction found in primary library package:redux/redux.dart.

Health suggestions

Format lib/src/store.dart.

Run dartfmt to format lib/src/store.dart.

Maintenance suggestions

The description is too short. (-20 points)

Add more detail about the package, what it does and what is its target use case. Try to write at least 60 characters.

Maintain an example.

None of the files in your example/ directory matches a known example patterns. Common file name patterns include: main.dart, example.dart or you could also use redux.dart. Packages with multiple examples should use example/


Package Constraint Resolved Available
Direct dependencies
Dart SDK >=1.24.0 <3.0.0
Dev dependencies
browser >=0.10.0+2 <0.11.0
test >=0.12.24+2 <0.13.0