useReducerLazy
External Documentation
ReducerHook<
- TInit
Initializes state of a function component to init(initialArg) and creates
dispatch method.
Example:
Map<String, dynamic> initializeCount(int initialValue) {
return {'count': initialValue};
}
Map<String, dynamic> reducer(
Map<String, dynamic> state,
Map<String, dynamic> action,
) {
switch (action['type']) {
case 'increment':
return {...state, 'count': state['count'] + 1};
case 'decrement':
return {...state, 'count': state['count'] - 1};
case 'reset':
return initializeCount(action['payload']);
default:
return state;
}
}
final MyComponent = registerFunctionComponent((props) {
final state = useReducerLazy(
reducer,
props['initialCount'],
initializeCount,
);
return div(children: [
pEl('Count: ${state.state['count']}'),
button(
text: '+',
onClick: () => state.dispatch({'type': 'increment'}),
),
button(
text: 'Reset',
onClick: () => state.dispatch({
'type': 'reset',
'payload': props['initialCount'],
}),
),
]);
});
Implementation
ReducerHook<TState, TAction> useReducerLazy<TState, TAction, TInit>(
TState Function(TState state, TAction action) reducer,
TInit initialArg,
TState Function(TInit) init,
) {
JSAny? jsReducer(JSAny? jsState, JSAny? jsAction) {
final dartState = jsState.dartify() as TState;
final dartAction = jsAction.dartify() as TAction;
final newState = reducer(dartState, dartAction);
return (newState == null) ? null : (newState as Object).jsify();
}
JSAny? jsInit(JSAny? jsArg) {
final dartArg = jsArg.dartify() as TInit;
final state = init(dartArg);
return (state == null) ? null : (state as Object).jsify();
}
final jsInitialArg = (initialArg == null)
? null
: (initialArg as Object).jsify();
final result = _reactUseReducer(jsReducer.toJS, jsInitialArg, jsInit.toJS);
final state = result[0].dartify() as TState;
final dispatch = result[1]! as JSFunction;
return ReducerHook._(state, (action) {
dispatch.callAsFunction(null, action.jsify());
});
}