Skip to content

Commit e47ed10

Browse files
committed
update pub lib and support redux epic
1 parent 621181c commit e47ed10

File tree

11 files changed

+142
-110
lines changed

11 files changed

+142
-110
lines changed

ios/Podfile.lock

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@ PODS:
1818
- Flutter
1919
- path_provider (0.0.1):
2020
- Flutter
21+
- path_provider_macos (0.0.1):
22+
- Flutter
2123
- permission_handler (3.2.2):
2224
- Flutter
2325
- Reachability (3.2)
24-
- share (0.5.2):
26+
- share (0.0.1):
2527
- Flutter
2628
- shared_preferences (0.0.1):
2729
- Flutter
@@ -50,6 +52,7 @@ DEPENDENCIES:
5052
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
5153
- package_info (from `.symlinks/plugins/package_info/ios`)
5254
- path_provider (from `.symlinks/plugins/path_provider/ios`)
55+
- path_provider_macos (from `.symlinks/plugins/path_provider_macos/ios`)
5356
- permission_handler (from `.symlinks/plugins/permission_handler/ios`)
5457
- share (from `.symlinks/plugins/share/ios`)
5558
- shared_preferences (from `.symlinks/plugins/shared_preferences/ios`)
@@ -83,6 +86,8 @@ EXTERNAL SOURCES:
8386
:path: ".symlinks/plugins/package_info/ios"
8487
path_provider:
8588
:path: ".symlinks/plugins/path_provider/ios"
89+
path_provider_macos:
90+
:path: ".symlinks/plugins/path_provider_macos/ios"
8691
permission_handler:
8792
:path: ".symlinks/plugins/permission_handler/ios"
8893
share:
@@ -113,18 +118,19 @@ SPEC CHECKSUMS:
113118
fluttertoast: b644586ef3b16f67fae9a1f8754cef6b2d6b634b
114119
FMDB: 6198a90e7b6900cfc046e6bc0ef6ebb7be9236aa
115120
package_info: 48b108e75b8802c2d5e126f208ef540561c98aef
116-
path_provider: fb74bd0465e96b594bb3b5088ee4a4e7bb1f2a9d
121+
path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c
122+
path_provider_macos: f760a3c5b04357c380e2fddb6f9db6f3015897e0
117123
permission_handler: d59f41439f5bc6c4d1005f3355e98f05ddc68ece
118124
Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96
119-
share: bae0a282aab4483288913fc4dc0b935d4b491f2e
125+
share: 0b2c3e82132f5888bccca3351c504d0003b3b410
120126
shared_preferences: 430726339841afefe5142b9c1f50cb6bd7793e01
121127
shared_preferences_macos: f3f29b71ccbb56bf40c9dd6396c9acf15e214087
122128
shared_preferences_web: 141cce0c3ed1a1c5bf2a0e44f52d31eeb66e5ea9
123129
sqflite: 4001a31ff81d210346b500c55b17f4d6c7589dd0
124130
url_launcher: a1c0cc845906122c4784c542523d8cacbded5626
125131
url_launcher_macos: fd7894421cd39320dce5f292fc99ea9270b2a313
126132
url_launcher_web: e5527357f037c87560776e36436bf2b0288b965c
127-
webview_flutter: bec7599de6bfbe8008a739aa3ebd7b364ea9d0cd
133+
webview_flutter: d2b4d6c66968ad042ad94cbb791f5b72b4678a96
128134

129135
PODFILE CHECKSUM: 083258d7f5e80b42ea9bfee905fe93049bc04c64
130136

lib/page/trend/trend_bloc.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class TrendBloc {
2020
///rxdart 实现的 stream
2121
var _subject = PublishSubject<List<TrendingRepoModel>>();
2222

23-
Observable<List<TrendingRepoModel>> get stream => _subject.stream;
23+
Stream<List<TrendingRepoModel>> get stream => _subject.stream;
2424

2525
///根据数据库和网络返回数据
2626
Future<void> requestRefresh(selectTime, selectType) async {

lib/redux/gsy_state.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import 'package:flutter/material.dart';
22
import 'package:gsy_github_app_flutter/model/User.dart';
33
import 'package:gsy_github_app_flutter/redux/login_redux.dart';
4-
import 'package:gsy_github_app_flutter/redux/middleware/epic_middleware.dart';
54
import 'package:gsy_github_app_flutter/redux/user_redux.dart';
65
import 'package:gsy_github_app_flutter/redux/theme_redux.dart';
76
import 'package:gsy_github_app_flutter/redux/locale_redux.dart';
87
import 'package:redux/redux.dart';
98

9+
import 'middleware/epic_middleware.dart';
10+
1011
/**
1112
* Redux全局State
1213
* Created by guoshuyu
@@ -52,9 +53,9 @@ GSYState appReducer(GSYState state, action) {
5253
}
5354

5455
final List<Middleware<GSYState>> middleware = [
55-
EpicMiddleware<GSYState>(UserInfoEpic()),
56-
EpicMiddleware<GSYState>(LoginEpic()),
57-
EpicMiddleware<GSYState>(OAuthEpic()),
56+
EpicMiddleware<GSYState>(loginEpic),
57+
EpicMiddleware<GSYState>(userInfoEpic),
58+
EpicMiddleware<GSYState>(oauthEpic),
5859
UserInfoMiddleware(),
5960
LoginMiddleware(),
6061
];

lib/redux/login_redux.dart

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@ import 'package:flutter/material.dart';
22
import 'package:gsy_github_app_flutter/db/sql_manager.dart';
33
import 'package:gsy_github_app_flutter/common/dao/user_dao.dart';
44
import 'package:gsy_github_app_flutter/redux/gsy_state.dart';
5-
import 'package:gsy_github_app_flutter/redux/middleware/epic.dart';
6-
import 'package:gsy_github_app_flutter/redux/middleware/epic_store.dart';
75
import 'package:gsy_github_app_flutter/common/utils/common_utils.dart';
86
import 'package:gsy_github_app_flutter/common/utils/navigator_utils.dart';
97
import 'package:redux/redux.dart';
108
import 'package:rxdart/rxdart.dart';
9+
import 'middleware/epic_store.dart';
1110

1211
/**
1312
* 登录相关Redux
@@ -71,14 +70,7 @@ class LoginMiddleware implements MiddlewareClass<GSYState> {
7170
}
7271
}
7372

74-
class LoginEpic implements EpicClass<GSYState> {
75-
@override
76-
Stream<dynamic> call(Stream<dynamic> actions, EpicStore<GSYState> store) {
77-
return Observable(actions)
78-
.whereType<LoginAction>()
79-
.switchMap((action) => _loginIn(action, store));
80-
}
81-
73+
Stream<dynamic> loginEpic(Stream<dynamic> actions, EpicStore<GSYState> store) {
8274
Stream<dynamic> _loginIn(
8375
LoginAction action, EpicStore<GSYState> store) async* {
8476
CommonUtils.showLoadingDialog(action.context);
@@ -87,21 +79,20 @@ class LoginEpic implements EpicClass<GSYState> {
8779
Navigator.pop(action.context);
8880
yield LoginSuccessAction(action.context, (res != null && res.result));
8981
}
82+
return actions
83+
.whereType<LoginAction>()
84+
.switchMap((action) => _loginIn(action, store));
9085
}
9186

92-
class OAuthEpic implements EpicClass<GSYState> {
93-
@override
94-
Stream<dynamic> call(Stream<dynamic> actions, EpicStore<GSYState> store) {
95-
return Observable(actions)
96-
.whereType<OAuthAction>()
97-
.switchMap((action) => _loginIn(action, store));
98-
}
99-
87+
Stream<dynamic> oauthEpic(Stream<dynamic> actions, EpicStore<GSYState> store) {
10088
Stream<dynamic> _loginIn(
10189
OAuthAction action, EpicStore<GSYState> store) async* {
10290
CommonUtils.showLoadingDialog(action.context);
10391
var res = await UserDao.oauth(action.code, store);
10492
Navigator.pop(action.context);
10593
yield LoginSuccessAction(action.context, (res != null && res.result));
10694
}
95+
return actions
96+
.whereType<OAuthAction>()
97+
.switchMap((action) => _loginIn(action, store));
10798
}

lib/redux/middleware/combine_epics.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import 'dart:async';
22

3-
import 'package:gsy_github_app_flutter/redux/middleware/epic.dart';
4-
import 'package:gsy_github_app_flutter/redux/middleware/epic_store.dart';
53
import 'package:rxdart/streams.dart';
64

5+
import 'epic.dart';
6+
import 'epic_store.dart';
7+
78
/// Combines a list of [Epic]s into one.
89
///
910
/// Rather than having one massive [Epic] that handles every possible type of
@@ -23,6 +24,7 @@ import 'package:rxdart/streams.dart';
2324
/// ]);
2425
Epic<State> combineEpics<State>(List<Epic<State>> epics) {
2526
return (Stream<dynamic> actions, EpicStore<State> store) {
26-
return new MergeStream<dynamic>(epics.map((epic) => epic(actions, store)));
27+
return MergeStream<dynamic>(
28+
epics.map((epic) => epic(actions, store)).toList());
2729
};
2830
}

lib/redux/middleware/epic.dart

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import 'dart:async';
22

3-
import 'package:gsy_github_app_flutter/redux/middleware/epic_store.dart';
4-
3+
import 'epic_store.dart';
54

65
/// A function that transforms one stream of actions into another
76
/// stream of actions.
@@ -52,8 +51,10 @@ import 'package:gsy_github_app_flutter/redux/middleware/epic_store.dart';
5251
/// .then((results) => new SearchResultsAction(results))
5352
/// .catchError((error) => new SearchErrorAction(error)));
5453
/// }
55-
typedef Stream<dynamic> Epic<State>(
56-
Stream<dynamic> actions, EpicStore<State> store);
54+
typedef Epic<State> = Stream<dynamic> Function(
55+
Stream<dynamic> actions,
56+
EpicStore<State> store,
57+
);
5758

5859
/// A class that acts as an [Epic], transforming one stream of actions into
5960
/// another stream of actions. Generally, [Epic] functions are simpler, but
@@ -63,7 +64,7 @@ typedef Stream<dynamic> Epic<State>(
6364
///
6465
/// class ExampleEpic extends EpicClass<State> {
6566
/// @override
66-
/// Stream<dynamic> map(Stream<dynamic> actions, EpicStore<State> store) {
67+
/// Stream<dynamic> call(Stream<dynamic> actions, EpicStore<State> store) {
6768
/// return actions
6869
/// .where((action) => action is PerformSearchAction)
6970
/// .asyncMap((action) =>
@@ -117,7 +118,7 @@ class TypedEpic<State, Action> extends EpicClass<State> {
117118
@override
118119
Stream<dynamic> call(Stream<dynamic> actions, EpicStore<State> store) {
119120
return epic(
120-
actions.transform(new StreamTransformer<dynamic, Action>.fromHandlers(
121+
actions.transform(StreamTransformer<dynamic, Action>.fromHandlers(
121122
handleData: (dynamic action, EventSink<Action> sink) {
122123
if (action is Action) {
123124
sink.add(action);

lib/redux/middleware/epic_middleware.dart

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import 'dart:async';
22

3-
import 'package:gsy_github_app_flutter/redux/middleware/epic.dart';
4-
import 'package:gsy_github_app_flutter/redux/middleware/epic_store.dart';
53
import 'package:redux/redux.dart';
64
import 'package:rxdart/transformers.dart';
75

6+
import 'epic.dart';
7+
import 'epic_store.dart';
8+
89
/// A [Redux](https://pub.dartlang.org/packages/redux) middleware that passes
910
/// a stream of dispatched actions to the given [Epic].
1011
///
@@ -19,9 +20,9 @@ import 'package:rxdart/transformers.dart';
1920
/// initialState: [], middleware: [epicMiddleware]);
2021
class EpicMiddleware<State> extends MiddlewareClass<State> {
2122
final StreamController<dynamic> _actions =
22-
new StreamController<dynamic>.broadcast();
23+
StreamController<dynamic>.broadcast();
2324
final StreamController<Epic<State>> _epics =
24-
new StreamController.broadcast(sync: true);
25+
StreamController.broadcast(sync: true);
2526

2627
final bool supportAsyncGenerators;
2728
Epic<State> _epic;
@@ -31,12 +32,10 @@ class EpicMiddleware<State> extends MiddlewareClass<State> {
3132
: _epic = epic;
3233

3334
@override
34-
call(Store<State> store, dynamic action, NextDispatcher next) {
35+
void call(Store<State> store, dynamic action, NextDispatcher next) {
3536
if (!_isSubscribed) {
3637
_epics.stream
37-
.transform<dynamic>(
38-
new SwitchMapStreamTransformer<Epic<State>, dynamic>(
39-
(epic) => epic(_actions.stream, new EpicStore(store))))
38+
.switchMap<dynamic>((epic) => epic(_actions.stream, EpicStore(store)))
4039
.listen(store.dispatch);
4140

4241
_epics.add(_epic);
@@ -50,7 +49,7 @@ class EpicMiddleware<State> extends MiddlewareClass<State> {
5049
// Future.delayed is an ugly hack to support async* functions.
5150
//
5251
// See: https://github.com/dart-lang/sdk/issues/33818
53-
new Future.delayed(Duration.zero, () {
52+
Future.delayed(Duration.zero, () {
5453
_actions.add(action);
5554
});
5655
} else {

lib/redux/middleware/epic_store.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ class EpicStore<State> {
1616

1717
Stream<State> get onChange => _store.onChange;
1818

19-
void dispatch(dynamic action) {
20-
_store.dispatch(action);
19+
/// through to the reducer.
20+
dynamic dispatch(dynamic action) {
21+
return _store.dispatch(action);
2122
}
2223
}

lib/redux/user_redux.dart

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import 'package:gsy_github_app_flutter/common/dao/user_dao.dart';
22
import 'package:gsy_github_app_flutter/model/User.dart';
33
import 'package:gsy_github_app_flutter/redux/gsy_state.dart';
4-
import 'package:gsy_github_app_flutter/redux/middleware/epic.dart';
5-
import 'package:gsy_github_app_flutter/redux/middleware/epic_store.dart';
64
import 'package:redux/redux.dart';
75
import 'package:rxdart/rxdart.dart';
86

7+
import 'middleware/epic_store.dart';
8+
9+
910
/**
1011
* 用户相关Redux
1112
* Created by guoshuyu
@@ -33,12 +34,9 @@ class UpdateUserAction {
3334
UpdateUserAction(this.userInfo);
3435
}
3536

36-
class FetchUserAction {
37-
}
38-
37+
class FetchUserAction {}
3938

4039
class UserInfoMiddleware implements MiddlewareClass<GSYState> {
41-
4240
@override
4341
void call(Store<GSYState> store, dynamic action, NextDispatcher next) {
4442
if (action is UpdateUserAction) {
@@ -49,21 +47,19 @@ class UserInfoMiddleware implements MiddlewareClass<GSYState> {
4947
}
5048
}
5149

52-
class UserInfoEpic implements EpicClass<GSYState> {
53-
@override
54-
Stream<dynamic> call(Stream<dynamic> actions, EpicStore<GSYState> store) {
55-
return Observable(actions)
56-
// to UpdateUserAction actions
57-
.whereType<FetchUserAction>()
58-
// Don't start until the 10ms
59-
.debounce(((_) => TimerStream(true, const Duration(milliseconds: 10))))
60-
.switchMap((action) => _loadUserInfo());
61-
}
62-
50+
Stream<dynamic> userInfoEpic(
51+
Stream<dynamic> actions, EpicStore<GSYState> store) {
6352
// Use the async* function to make easier
6453
Stream<dynamic> _loadUserInfo() async* {
6554
print("*********** userInfoEpic _loadUserInfo ***********");
6655
var res = await UserDao.getUserInfo(null);
6756
yield UpdateUserAction(res.data);
6857
}
69-
}
58+
59+
return actions
60+
// to UpdateUserAction actions
61+
.whereType<FetchUserAction>()
62+
// Don't start until the 10ms
63+
.debounce(((_) => TimerStream(true, const Duration(milliseconds: 10))))
64+
.switchMap((action) => _loadUserInfo());
65+
}

0 commit comments

Comments
 (0)