Skip to content

Commit 4ab9374

Browse files
committed
尝试迁移重构bloc模式
1 parent 3e24e13 commit 4ab9374

File tree

13 files changed

+589
-243
lines changed

13 files changed

+589
-243
lines changed

lib/bloc/base/base_bloc.dart

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:gsy_github_app_flutter/common/config/config.dart';
3+
import 'package:gsy_github_app_flutter/widget/gsy_pull_new_load_widget.dart';
4+
5+
/**
6+
* Created by guoshuyu
7+
* on 2019/3/23.
8+
*/
9+
class BlocProvider<T extends BlocBase> extends StatefulWidget {
10+
BlocProvider({
11+
Key key,
12+
@required this.child,
13+
@required this.bloc,
14+
}) : super(key: key);
15+
16+
final T bloc;
17+
final Widget child;
18+
19+
@override
20+
_BlocProviderState<T> createState() => _BlocProviderState<T>();
21+
22+
static T of<T extends BlocBase>(BuildContext context) {
23+
final type = _typeOf<BlocProvider<T>>();
24+
BlocProvider<T> provider = context.ancestorWidgetOfExactType(type);
25+
return provider.bloc;
26+
}
27+
28+
static Type _typeOf<T>() => T;
29+
}
30+
31+
class _BlocProviderState<T> extends State<BlocProvider<BlocBase>> {
32+
@override
33+
void dispose() {
34+
widget.bloc.dispose();
35+
super.dispose();
36+
}
37+
38+
@override
39+
Widget build(BuildContext context) {
40+
return widget.child;
41+
}
42+
}
43+
44+
abstract class BlocListBase extends BlocBase {
45+
46+
int _page = 1;
47+
48+
final GSYPullLoadWidgetControl pullLoadWidgetControl = new GSYPullLoadWidgetControl();
49+
50+
@mustCallSuper
51+
@override
52+
void dispose() {
53+
pullLoadWidgetControl.dispose();
54+
}
55+
56+
@protected
57+
pageReset() {
58+
_page = 1;
59+
}
60+
61+
@protected
62+
pageUp() {
63+
_page++;
64+
}
65+
66+
@protected
67+
getLoadMoreStatus(res) {
68+
return (res != null && res.data != null && res.data.length == Config.PAGE_SIZE);
69+
}
70+
71+
int get page => _page;
72+
73+
74+
///列表数据长度
75+
int getDataLength() {
76+
return pullLoadWidgetControl.dataList.length;
77+
}
78+
79+
///修改加载更多
80+
changeLoadMoreStatus(bool needLoadMore) {
81+
pullLoadWidgetControl.needLoadMore = needLoadMore;
82+
}
83+
84+
///是否需要头部
85+
changeNeedHeaderStatus(bool needHeader) {
86+
pullLoadWidgetControl.needHeader = needHeader;
87+
}
88+
89+
///列表数据
90+
get dataList => pullLoadWidgetControl.dataList;
91+
92+
///刷新列表数据
93+
refreshData(List listData) {
94+
if (pullLoadWidgetControl.dataList != null) {
95+
pullLoadWidgetControl.dataList = listData;
96+
}
97+
}
98+
99+
///加载更多数据
100+
loadMoreData(List listData) {
101+
if (listData != null) {
102+
pullLoadWidgetControl.addList(listData);
103+
}
104+
}
105+
106+
///清理数据
107+
clearData() {
108+
refreshData([]);
109+
}
110+
}
111+
112+
abstract class BlocBase {
113+
void dispose();
114+
}

lib/bloc/dynamic_bloc.dart

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import 'package:gsy_github_app_flutter/bloc/base/base_bloc.dart';
2+
import 'package:gsy_github_app_flutter/common/config/config.dart';
3+
import 'package:gsy_github_app_flutter/common/dao/event_dao.dart';
4+
5+
/**
6+
* Created by guoshuyu
7+
* on 2019/3/23.
8+
*/
9+
class DynamicBloc extends BlocListBase {
10+
requestRefresh(String userName) async {
11+
pageReset();
12+
var res = await EventDao.getEventReceived(userName, page: page, needDb: true);
13+
changeLoadMoreStatus(getLoadMoreStatus(res));
14+
return res;
15+
}
16+
17+
requestLoadMore(String userName) async {
18+
pageUp();
19+
var res = await EventDao.getEventReceived(userName, page: page);
20+
changeLoadMoreStatus(getLoadMoreStatus(res));
21+
return res;
22+
}
23+
}

lib/bloc/trend_bloc.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import 'package:gsy_github_app_flutter/bloc/base/base_bloc.dart';
2+
import 'package:gsy_github_app_flutter/common/dao/repos_dao.dart';
3+
4+
/**
5+
* Created by guoshuyu
6+
* on 2019/3/23.
7+
*/
8+
class TrendBloc extends BlocListBase {
9+
requestRefresh(selectTime, selectType) async {
10+
pageReset();
11+
var res = await ReposDao.getTrendDao(since: selectTime.value, languageType: selectType.value);
12+
changeLoadMoreStatus(getLoadMoreStatus(res));
13+
return res;
14+
}
15+
}

lib/common/dao/event_dao.dart

Lines changed: 35 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,51 +4,48 @@ import 'package:gsy_github_app_flutter/common/ab/provider/event/received_event_d
44
import 'package:gsy_github_app_flutter/common/ab/provider/event/user_event_db_provider.dart';
55
import 'package:gsy_github_app_flutter/common/dao/dao_result.dart';
66
import 'package:gsy_github_app_flutter/common/model/Event.dart';
7-
import 'package:gsy_github_app_flutter/common/model/User.dart';
87
import 'package:gsy_github_app_flutter/common/net/address.dart';
98
import 'package:gsy_github_app_flutter/common/net/api.dart';
10-
import 'package:gsy_github_app_flutter/common/redux/event_redux.dart';
11-
import 'package:gsy_github_app_flutter/common/redux/gsy_state.dart';
129
import 'package:redux/redux.dart';
1310

1411
class EventDao {
15-
static getEventReceived(Store<GSYState> store, {page = 1, bool needDb = false}) async {
16-
User user = store.state.userInfo;
17-
if (user == null || user.login == null) {
12+
static getEventReceived(String userName, {page = 1, bool needDb = false}) async {
13+
if (userName == null) {
1814
return null;
1915
}
2016
ReceivedEventDbProvider provider = new ReceivedEventDbProvider();
21-
if(needDb) {
22-
List<Event> dbList = await provider.getEvents();
23-
if (dbList.length > 0) {
24-
store.dispatch(new RefreshEventAction(dbList));
17+
18+
next() async {
19+
String url = Address.getEventReceived(userName) + Address.getPageParams("?", page);
20+
21+
var res = await httpManager.netFetch(url, null, null, null);
22+
if (res != null && res.result) {
23+
List<Event> list = new List();
24+
var data = res.data;
25+
if (data == null || data.length == 0) {
26+
return null;
27+
}
28+
if (needDb) {
29+
await provider.insert(json.encode(data));
30+
}
31+
for (int i = 0; i < data.length; i++) {
32+
list.add(Event.fromJson(data[i]));
33+
}
34+
return new DataResult(list, true);
35+
} else {
36+
return new DataResult(null, false);
2537
}
2638
}
27-
String userName = user.login;
28-
String url = Address.getEventReceived(userName) + Address.getPageParams("?", page);
2939

30-
var res = await httpManager.netFetch(url, null, null, null);
31-
if (res != null && res.result) {
32-
List<Event> list = new List();
33-
var data = res.data;
34-
if (data == null || data.length == 0) {
35-
return null;
36-
}
37-
if(needDb) {
38-
await provider.insert(json.encode(data));
39-
}
40-
for (int i = 0; i < data.length; i++) {
41-
list.add(Event.fromJson(data[i]));
42-
}
43-
if (page == 1) {
44-
store.dispatch(new RefreshEventAction(list));
45-
} else {
46-
store.dispatch(new LoadMoreEventAction(list));
40+
if (needDb) {
41+
List<Event> dbList = await provider.getEvents();
42+
if (dbList == null || dbList.length == 0) {
43+
return await next();
4744
}
48-
return list;
49-
} else {
50-
return null;
45+
DataResult dataResult = new DataResult(dbList, true, next: next());
46+
return dataResult;
5147
}
48+
return await next();
5249
}
5350

5451
/**
@@ -65,7 +62,7 @@ class EventDao {
6562
if (data == null || data.length == 0) {
6663
return new DataResult(list, true);
6764
}
68-
if(needDb) {
65+
if (needDb) {
6966
provider.insert(userName, json.encode(data));
7067
}
7168
for (int i = 0; i < data.length; i++) {
@@ -76,9 +73,10 @@ class EventDao {
7673
return null;
7774
}
7875
}
79-
if(needDb) {
76+
77+
if (needDb) {
8078
List<Event> dbList = await provider.getEvents(userName);
81-
if(dbList == null || dbList.length == 0) {
79+
if (dbList == null || dbList.length == 0) {
8280
return await next();
8381
}
8482
DataResult dataResult = new DataResult(dbList, true, next: next());
@@ -89,6 +87,7 @@ class EventDao {
8987

9088
static clearEvent(Store store) {
9189
store.state.eventList.clear();
92-
store.dispatch(new RefreshEventAction([]));
90+
91+
/// todo 清理
9392
}
9493
}

lib/common/dao/repos_dao.dart

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ import 'package:gsy_github_app_flutter/common/model/User.dart';
2828
import 'package:gsy_github_app_flutter/common/net/address.dart';
2929
import 'package:gsy_github_app_flutter/common/net/api.dart';
3030
import 'package:gsy_github_app_flutter/common/net/trending/github_trending.dart';
31-
import 'package:gsy_github_app_flutter/common/redux/trend_redux.dart';
32-
import 'package:gsy_github_app_flutter/common/style/gsy_style.dart';
3331
import 'package:gsy_github_app_flutter/common/utils/common_utils.dart';
3432
import 'package:package_info/package_info.dart';
3533
import 'package:pub_semver/pub_semver.dart';
@@ -47,32 +45,39 @@ class ReposDao {
4745
* @param since 数据时长, 本日,本周,本月
4846
* @param languageType 语言
4947
*/
50-
static getTrendDao(Store store, {since = 'daily', languageType, page = 0, needDb = true}) async {
48+
static getTrendDao({since = 'daily', languageType, page = 0, needDb = true}) async {
5149
TrendRepositoryDbProvider provider = new TrendRepositoryDbProvider();
5250
String languageTypeDb = languageType ?? "*";
53-
List<TrendingRepoModel> list = await provider.getData(languageTypeDb, since);
54-
if (list != null && list.length > 0) {
55-
store.dispatch(new RefreshTrendAction(list));
56-
}
57-
String url = Address.trending(since, languageType);
58-
var res = await new GitHubTrending().fetchTrending(url);
59-
if (res != null && res.result && res.data.length > 0) {
60-
List<TrendingRepoModel> list = new List();
61-
var data = res.data;
62-
if (data == null || data.length == 0) {
51+
52+
next() async {
53+
String url = Address.trending(since, languageType);
54+
var res = await new GitHubTrending().fetchTrending(url);
55+
if (res != null && res.result && res.data.length > 0) {
56+
List<TrendingRepoModel> list = new List();
57+
var data = res.data;
58+
if (data == null || data.length == 0) {
59+
return new DataResult(null, false);
60+
}
61+
if (needDb) {
62+
provider.insert(languageTypeDb, since, json.encode(data));
63+
}
64+
for (int i = 0; i < data.length; i++) {
65+
TrendingRepoModel model = data[i];
66+
list.add(model);
67+
}
68+
return new DataResult(list, true);
69+
} else {
6370
return new DataResult(null, false);
6471
}
65-
if (needDb) {
66-
provider.insert(languageTypeDb, since, json.encode(data));
67-
}
68-
for (int i = 0; i < data.length; i++) {
69-
TrendingRepoModel model = data[i];
70-
list.add(model);
72+
}
73+
74+
if (needDb) {
75+
List<TrendingRepoModel> list = await provider.getData(languageTypeDb, since);
76+
if (list != null && list.length > 0) {
77+
return await next();
7178
}
72-
store.dispatch(new RefreshTrendAction(list));
73-
return new DataResult(list, true);
74-
} else {
75-
return new DataResult(null, false);
79+
DataResult dataResult = new DataResult(list, true, next: next());
80+
return dataResult;
7681
}
7782
}
7883

@@ -607,12 +612,7 @@ class ReposDao {
607612
? Address.getReposRelease(userName, reposName) + Address.getPageParams("?", page)
608613
: Address.getReposTag(userName, reposName) + Address.getPageParams("?", page);
609614

610-
var res = await httpManager.netFetch(
611-
url,
612-
null,
613-
{"Accept": (needHtml ? 'application/vnd.github.html,application/vnd.github.VERSION.raw' : "")},
614-
null
615-
);
615+
var res = await httpManager.netFetch(url, null, {"Accept": (needHtml ? 'application/vnd.github.html,application/vnd.github.VERSION.raw' : "")}, null);
616616
if (res != null && res.result && res.data.length > 0) {
617617
List<Release> list = new List();
618618
var dataList = res.data;
@@ -717,8 +717,6 @@ class ReposDao {
717717
}
718718
}
719719

720-
721-
722720
/**
723721
* 获取阅读历史
724722
*/

0 commit comments

Comments
 (0)