Skip to content

Commit 557f66d

Browse files
committed
refactor: store
1 parent aa6296a commit 557f66d

File tree

11 files changed

+62
-34
lines changed

11 files changed

+62
-34
lines changed

example/lib/main.dart

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
1+
import 'package:example/config.dart';
2+
import 'package:example/modules/app_reducer.dart';
3+
import 'package:example/modules/app_state.dart';
4+
import 'package:example/my_app.dart';
15
import 'package:flutter/material.dart';
26
import 'package:redux_toolkit/redux_toolkit.dart';
37

4-
import 'app_state.dart';
5-
import 'config.dart';
6-
import 'my_app.dart';
7-
import 'reducer.dart';
8-
98
Future main() async {
109
WidgetsFlutterBinding.ensureInitialized();
1110
await Config.initialize();
1211

1312
final store = await configureStore<AppState>((builder) {
1413
builder.withReducer(reducer);
15-
builder.withPreloadedState(AppState(loading: false, todos: List.unmodifiable([])));
14+
builder.withPreloadedState(AppState(status: {}, todos: List.unmodifiable([])));
1615

1716
if (Config.reduxDevtoolsEnabled) {
1817
builder.usingDevtools(Config.reduxDevtoolsUrl);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import 'package:example/modules/app_state.dart';
2+
import 'package:example/modules/status/reducer.dart';
3+
import 'package:example/modules/todos/todos_reducer.dart';
4+
5+
AppState reducer(AppState state, dynamic action) {
6+
return AppState(
7+
status: statusReducer(state.status, action),
8+
todos: todosReducer(state.todos, action));
9+
}

example/lib/app_state.dart renamed to example/lib/modules/app_state.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1+
import 'package:example/todo.dart';
12
import 'package:meta/meta.dart';
23
import 'package:json_annotation/json_annotation.dart';
34

4-
import 'todo.dart';
5-
65
part 'app_state.g.dart';
76

87
@immutable
98
@JsonSerializable(explicitToJson: true)
109
class AppState {
11-
final bool loading;
10+
final Map<String, String> status;
1211
final List<Todo> todos;
13-
AppState({this.loading, this.todos});
12+
13+
AppState({this.status, this.todos});
1414

1515
factory AppState.fromJson(Map<String, dynamic> json) => _$AppStateFromJson(json);
1616
Map<String, dynamic> toJson() => _$AppStateToJson(this);
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import 'package:redux_toolkit/redux_toolkit.dart';
2+
3+
bool _isGeneric(dynamic a) =>
4+
a.runtimeTypeoString().contains('<') &&
5+
a.runtimeType.toString().contains('>');
6+
String _typeOfAction(dynamic a) => a.runtimeType.toString().split('<')[0];
7+
String _typeOfThunk(dynamic a) =>
8+
a.runtimeType.toString().split('<')[1].split(',')[0];
9+
10+
final statusReducer = createReducer(
11+
Map<String, String>.unmodifiable({}),
12+
(builder) => builder.addMatcher(
13+
(action) =>
14+
_isGeneric(action) &&
15+
['Pending', 'Rejected'].contains(_typeOfAction(action)),
16+
(state, action) =>
17+
{...state, _typeOfThunk(action): _typeOfAction(action)}));
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import 'package:example/modules/app_state.dart';
2+
import 'package:redux_toolkit/redux_toolkit.dart';
3+
4+
final _selectStatus = (AppState state) => state.status;
5+
final selectIsPending = (String key) => createSelector1(_selectStatus, (status) => status[key]);

example/lib/actions.dart renamed to example/lib/modules/todos/actions.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import 'dart:convert';
22

3+
import 'package:example/modules/app_state.dart';
4+
import 'package:example/config.dart';
5+
import 'package:example/todo.dart';
36
import 'package:meta/meta.dart';
47
import 'package:redux_toolkit/redux_toolkit.dart';
58
import 'package:http/http.dart' as http;
69

7-
import 'app_state.dart';
8-
import 'config.dart';
9-
import 'todo.dart';
10-
1110
@immutable
1211
class FetchTodos extends AsyncThunk<FetchTodos, AppState, void, List<Todo>> {
1312
@override
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import 'package:example/modules/todos/actions.dart';
2+
import 'package:example/todo.dart';
3+
import 'package:redux_toolkit/redux_toolkit.dart';
4+
5+
final todosReducer = createReducer(
6+
List.unmodifiable([]),
7+
(builder) => builder.addCase<Fulfilled<FetchTodos, List<Todo>, void>>(
8+
(state, action) => action.payload));
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import 'package:example/modules/app_state.dart';
2+
import 'package:redux_toolkit/redux_toolkit.dart';
3+
4+
final _selectTodos = (AppState state) => state.todos;
5+
final selectAllTodos = createSelector1(_selectTodos, (todos) => todos);

example/lib/my_app.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
22
import 'package:redux/redux.dart';
33
import 'package:flutter_redux/flutter_redux.dart';
44

5-
import 'app_state.dart';
5+
import 'modules/app_state.dart';
66
import 'my_home_page.dart';
77

88
class MyApp extends StatelessWidget {

example/lib/my_home_page.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1+
import 'package:example/modules/app_state.dart';
2+
import 'package:example/modules/todos/actions.dart';
3+
import 'package:example/modules/todos/selectors.dart';
4+
import 'package:example/todo.dart';
15
import 'package:example/todo_list_item.dart';
26
import 'package:flutter/material.dart';
37
import 'package:flutter_hooks/flutter_hooks.dart' show HookWidget, useEffect;
48
import 'package:flutter_redux/flutter_redux.dart';
59

6-
import 'actions.dart';
7-
import 'app_state.dart';
8-
import 'todo.dart';
910

1011
class MyHomePage extends HookWidget {
1112
@override
@@ -21,7 +22,7 @@ class MyHomePage extends HookWidget {
2122
title: Text('Todos'),
2223
),
2324
body: StoreConnector<AppState, List<Todo>>(
24-
converter: (store) => store.state.todos,
25+
converter: (store) => selectAllTodos(store.state),
2526
builder: (context, todos) => ListView.builder(
2627
itemCount: todos.length,
2728
itemBuilder: (context, idx) => TodoListItem(todo: todos[idx])),

0 commit comments

Comments
 (0)