Skip to main content

Migrating from flutter_redux

Read this page only if you are migrating from flutter_redux (vanilla Redux) to Async Redux.

The converter parameter

The StoreConnector actually accepts two mutually exclusive parameters that can create the ViewModel, of which only one should be provided in the StoreConnector constructor:

  • vm (recommended) or
  • converter

We have already discusses the vm parameter, and that's the recommended way to provide the ViewModel to the StoreConnector.

However, if you are migrating from flutter_redux (vanilla Redux) to Async Redux, you can keep using flutter_redux's converter parameter:

Widget build(BuildContext context) {

return StoreConnector<int, ViewModel>(
converter: (store) => ViewModel.fromStore(store),
builder: (BuildContext context, ViewModel vm) => MyWidget(...),
);
}

On contrary to the vm parameter, your ViewModel class here does not need to extend Vm, and you don't need to use VmFactory to create it.

Simply add a static factory to your ViewModel. It should get a store and return the ViewModel:

class ViewModel {
final String name;
final VoidCallback onSave;

ViewModel({
required this.name,
required this.onSave,
});

static ViewModel fromStore(Store<AppState> store) {
return ViewModel(
name: store.state,
onSave: () => store.dispatch(IncrementAction(amount: 1)),
);
}

bool operator ==(Object other) =>
identical(this, other) ||
other is ViewModel && runtimeType == other.runtimeType && name == other.name;
}

However, if desired, the converter parameter can also make use of the Vm class to avoid having to create operator == manually:

class ViewModel extends Vm {
final String name;
final VoidCallback onSave;

ViewModel({
required this.name,
required this.onSave,
}) : super(equals: [name]);

static ViewModel fromStore(Store<AppState> store) {
return ViewModel(
name: store.state,
onSave: () => store.dispatch(IncrementAction(amount: 1)),
);
}
}

When using the converter parameter, it's a bit more difficult to create separate methods for helping construct your view-model:

static ViewModel fromStore(Store<AppState> store) {
return ViewModel(
name: _name(store),
onSave: _onSave(store),
);
}

static String _name(Store<AppState>) => store.state.user.name;

static VoidCallback _onSave(Store<AppState>) {
return () => store.dispatch(SaveUserAction());
}

To see the converter parameter in action, please run this example.