Skip to content

Commit 78dd10b

Browse files
hoc081098Nguyễn Thái  Học
andauthored
Fix/lazy state (#3)
* retry * updated * wip Co-authored-by: Nguyễn Thái Học <[email protected]>
1 parent db41d77 commit 78dd10b

File tree

6 files changed

+66
-45
lines changed

6 files changed

+66
-45
lines changed

lib/ui/home/home_page.dart

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,11 @@ class _MyHomePageState extends State<MyHomePage> with DisposeBagMixin {
5656
title: Text('Github repo search'),
5757
),
5858
body: Column(
59+
crossAxisAlignment: CrossAxisAlignment.stretch,
5960
children: [
61+
const SizedBox(height: 8),
6062
Padding(
61-
padding: const EdgeInsets.all(8.0),
63+
padding: const EdgeInsets.symmetric(horizontal: 8),
6264
child: TextField(
6365
decoration: const InputDecoration(
6466
suffixIcon: Icon(Icons.search),
@@ -69,6 +71,23 @@ class _MyHomePageState extends State<MyHomePage> with DisposeBagMixin {
6971
store.dispatch(SearchAction((b) => b..term = v)),
7072
),
7173
),
74+
const SizedBox(height: 8),
75+
RxStreamBuilder<String>(
76+
stream: store.select((state) => state.term),
77+
builder: (context, term) {
78+
return Padding(
79+
padding: const EdgeInsets.only(
80+
right: 8,
81+
left: 9,
82+
),
83+
child: Text(
84+
"Search results for '$term'",
85+
style: Theme.of(context).textTheme.subtitle1,
86+
),
87+
);
88+
},
89+
),
90+
const SizedBox(height: 8),
7291
Expanded(
7392
child: RxStreamBuilder<HomeState>(
7493
stream: store.stateStream,
@@ -94,7 +113,7 @@ class _MyHomePageState extends State<MyHomePage> with DisposeBagMixin {
94113
mainAxisSize: MainAxisSize.min,
95114
children: [
96115
Text(
97-
"Search for '${state.term}' error: ${state.error}'",
116+
'Error: ${state.error}',
98117
style: Theme.of(context).textTheme.subtitle1,
99118
textAlign: TextAlign.center,
100119
),
@@ -123,15 +142,15 @@ class _MyHomePageState extends State<MyHomePage> with DisposeBagMixin {
123142
if (state.term.trim().isNotEmpty) {
124143
return Center(
125144
child: Text(
126-
"Search for '${state.term}' empty results",
145+
'Empty results',
127146
style: Theme.of(context).textTheme.subtitle1,
128147
textAlign: TextAlign.center,
129148
),
130149
);
131150
} else {
132151
return Center(
133152
child: Text(
134-
'Search git repositories',
153+
'Search github repositories...',
135154
style: Theme.of(context).textTheme.subtitle1,
136155
textAlign: TextAlign.center,
137156
),

lib/ui/home/home_store.dart

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:flutter_github_search_rx_redux/domain/search_usecase.dart';
22
import 'package:rx_redux/rx_redux.dart';
33
import 'package:rxdart/rxdart.dart';
4+
import 'package:rxdart_ext/rxdart_ext.dart';
45

56
import 'home_action.dart';
67
import 'home_state.dart';
@@ -10,7 +11,7 @@ RxReduxStore<HomeAction, HomeState> createStore(SearchUseCase searchUseCase) =>
1011
initialState: HomeState.initial(),
1112
sideEffects: HomeSideEffects(searchUseCase)(),
1213
reducer: (state, action) => action.reduce(state),
13-
// logger: rxReduxDefaultLogger,
14+
logger: rxReduxDefaultLogger,
1415
);
1516

1617
class HomeSideEffects {
@@ -50,36 +51,44 @@ class HomeSideEffects {
5051
Stream<HomeAction> actions,
5152
GetState<HomeState> getState,
5253
) {
53-
final textChangedAction$ = actions.whereType<TextChangedAction>();
54+
final textChangedAction$ = actions.whereType<TextChangedAction>().debug();
55+
56+
final performLoadingNextPage = (LoadNextPageAction action) {
57+
return Stream.value(getState())
58+
.where((state) => state.canLoadNextPage)
59+
.exhaustMap((state) => _nextPage(state.term, state.page + 1)
60+
.takeUntil(textChangedAction$)
61+
.debug());
62+
};
5463

5564
return actions
5665
.whereType<LoadNextPageAction>()
57-
.map((_) => getState())
58-
.where((state) => state.canLoadNextPage)
59-
.exhaustMap((state) => _nextPage(state.term, state.page + 1)
60-
.takeUntil(textChangedAction$));
66+
.exhaustMap(performLoadingNextPage);
6167
}
6268

6369
Stream<HomeAction> retry(
6470
Stream<HomeAction> actions,
6571
GetState<HomeState> getState,
6672
) {
67-
final textChangedAction$ = actions.whereType<TextChangedAction>();
73+
final textChangedAction$ = actions.whereType<TextChangedAction>().debug();
6874

69-
return actions
70-
.whereType<RetryAction>()
71-
.map((_) => getState())
72-
.where((state) => state.canRetry)
73-
.exhaustMap((state) => _nextPage(state.term, state.page + 1)
74-
.takeUntil(textChangedAction$));
75+
final performRetry = (RetryAction action) {
76+
return Stream.value(getState())
77+
.where((state) => state.canRetry)
78+
.exhaustMap((state) => _nextPage(state.term, state.page + 1)
79+
.takeUntil(textChangedAction$)
80+
.debug());
81+
};
82+
83+
return actions.whereType<RetryAction>().exhaustMap(performRetry);
7584
}
7685

7786
Stream<HomeAction> _nextPage(String term, int nextPage) {
7887
final loadingAction = SearchLoadingAction((b) => b
7988
..term = term
8089
..nextPage = nextPage);
8190

82-
return Rx.defer(() => _searchUseCase(term: term, page: nextPage).asStream())
91+
return Rx.fromCallable(() => _searchUseCase(term: term, page: nextPage))
8392
.map<HomeAction>(
8493
(items) => SearchSuccessAction((b) => b
8594
..term = term

lib/ui/home/repo_items.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class RepoItemsListWidget extends StatelessWidget {
6969
}
7070

7171
return Padding(
72-
padding: const EdgeInsets.only(bottom: 12),
72+
padding: const EdgeInsets.symmetric(vertical: 12),
7373
child: Center(
7474
child: SizedBox(
7575
height: 48,

pubspec.lock

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,14 @@ packages:
9191
name: built_value
9292
url: "https://pub.dartlang.org"
9393
source: hosted
94-
version: "8.0.3"
94+
version: "8.0.4"
9595
built_value_generator:
9696
dependency: "direct dev"
9797
description:
9898
name: built_value_generator
9999
url: "https://pub.dartlang.org"
100100
source: hosted
101-
version: "8.0.3"
101+
version: "8.0.4"
102102
characters:
103103
dependency: transitive
104104
description:
@@ -189,7 +189,7 @@ packages:
189189
name: disposebag
190190
url: "https://pub.dartlang.org"
191191
source: hosted
192-
version: "1.5.0-nullsafety.1"
192+
version: "1.5.0"
193193
distinct_value_connectable_stream:
194194
dependency: transitive
195195
description:
@@ -236,7 +236,7 @@ packages:
236236
name: flutter_disposebag
237237
url: "https://pub.dartlang.org"
238238
source: hosted
239-
version: "1.1.0-nullsafety.1"
239+
version: "1.1.0"
240240
flutter_provider:
241241
dependency: "direct main"
242242
description:
@@ -274,7 +274,7 @@ packages:
274274
name: http
275275
url: "https://pub.dartlang.org"
276276
source: hosted
277-
version: "0.13.0"
277+
version: "0.13.1"
278278
http_multi_server:
279279
dependency: transitive
280280
description:
@@ -313,12 +313,10 @@ packages:
313313
loading_indicator:
314314
dependency: "direct main"
315315
description:
316-
path: "."
317-
ref: master
318-
resolved-ref: "8cd0d0781120d4eea91c31c9b32ba60d2d97597a"
319-
url: "https://github.com/Mayb3Nots/loading_indicator.git"
320-
source: git
321-
version: "2.0.0"
316+
name: loading_indicator
317+
url: "https://pub.dartlang.org"
318+
source: hosted
319+
version: "2.0.1"
322320
logging:
323321
dependency: transitive
324322
description:
@@ -353,7 +351,7 @@ packages:
353351
name: mockito
354352
url: "https://pub.dartlang.org"
355353
source: hosted
356-
version: "5.0.2"
354+
version: "5.0.3"
357355
node_preamble:
358356
dependency: transitive
359357
description:
@@ -432,7 +430,7 @@ packages:
432430
source: hosted
433431
version: "0.26.0"
434432
rxdart_ext:
435-
dependency: transitive
433+
dependency: "direct main"
436434
description:
437435
name: rxdart_ext
438436
url: "https://pub.dartlang.org"

pubspec.yaml

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,26 @@ environment:
88

99
dependencies:
1010
flutter_bloc_pattern: ^2.0.0
11-
flutter_disposebag: ^1.1.0-nullsafety.1
11+
flutter_disposebag: ^1.1.0
1212
rx_redux: ^2.2.0-nullsafety.2
1313
flutter_provider: ^2.0.0
14+
rxdart_ext: ^0.0.1
1415

1516
built_collection: ^5.0.0
1617
rxdart: ^0.26.0
17-
http: ^0.13.0
18-
built_value: ^8.0.3
18+
http: ^0.13.1
19+
built_value: ^8.0.4
1920
url_launcher: ^6.0.2
20-
loading_indicator: ^1.2.0
21+
loading_indicator: ^2.0.1
2122

2223
flutter:
2324
sdk: flutter
2425
cupertino_icons: ^1.0.2
2526

26-
dependency_overrides:
27-
loading_indicator:
28-
git:
29-
url: https://github.com/Mayb3Nots/loading_indicator.git
30-
ref: master
31-
3227
dev_dependencies:
33-
mockito: ^5.0.2
28+
mockito: ^5.0.3
3429
pedantic: ^1.11.0
35-
built_value_generator: ^8.0.3
30+
built_value_generator: ^8.0.4
3631
build_runner: ^1.12.2
3732
test:
3833
flutter_test:

test/mocks.mocks.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Mocks generated by Mockito 5.0.2 from annotations
1+
// Mocks generated by Mockito 5.0.3 from annotations
22
// in flutter_github_search_rx_redux/test/mocks.dart.
33
// Do not manually edit this file.
44

0 commit comments

Comments
 (0)