Skip to content

Commit 825fc52

Browse files
committed
✨ Add bangumi page and record detail page pull refresh.
1 parent 1416e10 commit 825fc52

17 files changed

+198
-134
lines changed

lib/model/record_details.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ class RecordDetail {
1111
late bool subscribed;
1212
late Map<String, String> more;
1313
late String intro;
14-
late List<Subgroup> subgroups;
14+
late List<Subgroup> subgroups = [];
1515

1616
// 详情地址
17-
late String url;
17+
late String url = "";
1818

1919
// 标题
2020
late String title;

lib/providers/bangumi_model.dart

+23-12
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ class BangumiModel extends CancelableBaseModel {
1414
final String id;
1515
final String cover;
1616

17-
bool _loading = false;
17+
int _refreshFlag = 0;
1818

19-
bool get loading => _loading;
19+
int get refreshFlag => _refreshFlag;
2020

2121
BangumiDetail? _bangumiDetail;
2222

@@ -35,12 +35,16 @@ class BangumiModel extends CancelableBaseModel {
3535
}
3636
}
3737

38-
final RefreshController _refreshController = RefreshController();
38+
final RefreshController _refreshController =
39+
RefreshController(initialRefresh: true);
3940

4041
RefreshController get refreshController => _refreshController;
4142

43+
final RefreshController _subgroupRefreshController = RefreshController();
44+
45+
RefreshController get subgroupRefreshController => _subgroupRefreshController;
46+
4247
BangumiModel(this.id, this.cover) {
43-
_loadBangumiDetail();
4448
Future.delayed(const Duration(milliseconds: 640))
4549
.whenComplete(() => _loadCoverMainColor());
4650
}
@@ -70,7 +74,7 @@ class BangumiModel extends CancelableBaseModel {
7074
loadSubgroupList(final String dataId) async {
7175
final sb = _bangumiDetail?.subgroupBangumis[dataId];
7276
if ((sb?.records.length ?? 0) < 10) {
73-
return _refreshController.loadNoData();
77+
return _subgroupRefreshController.loadNoData();
7478
}
7579
final Resp resp = await (this +
7680
Repo.bangumiMore(
@@ -80,28 +84,28 @@ class BangumiModel extends CancelableBaseModel {
8084
));
8185
if (resp.success) {
8286
if (sb?.records.length == resp.data.length) {
83-
_refreshController.loadNoData();
87+
_subgroupRefreshController.loadNoData();
8488
} else {
85-
_refreshController.loadComplete();
89+
_subgroupRefreshController.loadComplete();
8690
}
8791
sb?.records = resp.data;
8892
notifyListeners();
8993
} else {
90-
_refreshController.loadFailed();
94+
_subgroupRefreshController.loadFailed();
9195
resp.msg.toast();
9296
}
9397
}
9498

95-
_loadBangumiDetail() async {
96-
_loading = true;
97-
notifyListeners();
99+
load() async {
98100
final resp = await (this + Repo.bangumi(id));
99-
_loading = false;
101+
_refreshController.refreshCompleted();
100102
if (resp.success) {
101103
_bangumiDetail = resp.data;
104+
"加载成功".toast();
102105
} else {
103106
resp.msg?.toast();
104107
}
108+
_refreshFlag++;
105109
notifyListeners();
106110
}
107111

@@ -127,4 +131,11 @@ class BangumiModel extends CancelableBaseModel {
127131
}
128132
notifyListeners();
129133
}
134+
135+
@override
136+
void dispose() {
137+
_refreshController.dispose();
138+
_subgroupRefreshController.dispose();
139+
super.dispose();
140+
}
130141
}

lib/providers/index_model.dart

+6
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,12 @@ class IndexModel extends CancelableBaseModel {
147147
}
148148
notifyListeners();
149149
}
150+
151+
@override
152+
void dispose() {
153+
_refreshController.dispose();
154+
super.dispose();
155+
}
150156
}
151157

152158
typedef LoadSeasonIndex = int Function(int currIndex);

lib/providers/recent_subscribed_model.dart

+6
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,10 @@ class RecentSubscribedModel extends CancelableBaseModel {
5959
"获取最近更新失败:${resp.msg}".toast();
6060
}
6161
}
62+
63+
@override
64+
void dispose() {
65+
_refreshController.dispose();
66+
super.dispose();
67+
}
6268
}

lib/providers/record_detail_model.dart

+16-10
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,23 @@ import 'package:mikan_flutter/internal/repo.dart';
77
import 'package:mikan_flutter/model/record_details.dart';
88
import 'package:mikan_flutter/providers/base_model.dart';
99
import 'package:palette_generator/palette_generator.dart';
10+
import 'package:pull_to_refresh/pull_to_refresh.dart';
1011

1112
class RecordDetailModel extends CancelableBaseModel {
1213
final String url;
13-
bool _loading = false;
1414

1515
Size? coverSize;
1616

17-
bool get loading => _loading;
18-
1917
RecordDetail? _recordDetail;
2018

2119
RecordDetail? get recordDetail => _recordDetail;
2220

23-
RecordDetailModel(this.url) {
24-
refresh();
25-
}
21+
final RefreshController _refreshController =
22+
RefreshController(initialRefresh: true);
23+
24+
RefreshController get refreshController => _refreshController;
25+
26+
RecordDetailModel(this.url);
2627

2728
Color? _coverMainColor;
2829

@@ -48,13 +49,12 @@ class RecordDetailModel extends CancelableBaseModel {
4849
}
4950

5051
refresh() async {
51-
if (_loading) return;
52-
_loading = true;
5352
final Resp resp = await (this + Repo.details(url));
54-
_loading = false;
53+
_refreshController.refreshCompleted();
5554
if (resp.success) {
5655
_recordDetail = resp.data;
57-
_loadCoverMainColor();
56+
"加载成功".toast();
57+
if (_coverMainColor == null) _loadCoverMainColor();
5858
} else {
5959
"获取详情失败:${resp.msg}".toast();
6060
}
@@ -64,4 +64,10 @@ class RecordDetailModel extends CancelableBaseModel {
6464
subscribeChanged() {
6565
notifyListeners();
6666
}
67+
68+
@override
69+
void dispose() {
70+
_refreshController.dispose();
71+
super.dispose();
72+
}
6773
}

lib/providers/season_list_model.dart

+6
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,10 @@ class SeasonListModel extends CancelableBaseModel {
8383
if (_loading) return "加载中,请等待加载完成";
8484
await _loadSeasonBangumis();
8585
}
86+
87+
@override
88+
void dispose() {
89+
_refreshController.dispose();
90+
super.dispose();
91+
}
8692
}

lib/providers/season_model.dart

+6
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,10 @@ class SeasonModel extends CancelableBaseModel {
3939
"获取${_season.title}失败:${resp.msg}".toast();
4040
}
4141
}
42+
43+
@override
44+
void dispose() {
45+
_refreshController.dispose();
46+
super.dispose();
47+
}
4248
}

lib/providers/subgroup_model.dart

+6
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,10 @@ class SubgroupModel extends CancelableBaseModel {
5252
await _loadBangumis();
5353
_refreshController.refreshCompleted();
5454
}
55+
56+
@override
57+
void dispose() {
58+
_refreshController.dispose();
59+
super.dispose();
60+
}
5561
}

lib/providers/subscribed_model.dart

+6
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,10 @@ class SubscribedModel extends CancelableBaseModel {
9393
}
9494
notifyListeners();
9595
}
96+
97+
@override
98+
void dispose() {
99+
_refreshController.dispose();
100+
super.dispose();
101+
}
96102
}

lib/providers/subscribed_season_model.dart

+6
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,10 @@ class SubscribedSeasonModel extends CancelableBaseModel {
8686
if (_loading) return "加载中,请等待加载完成";
8787
await _loadSeasonBangumis();
8888
}
89+
90+
@override
91+
void dispose() {
92+
_refreshController.dispose();
93+
super.dispose();
94+
}
8995
}

lib/topvars.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ final edgeH24V36WithStatusBar = EdgeInsets.only(
7373
right: 24.0,
7474
);
7575

76-
final edgeH16T90B24WithStatusBar = EdgeInsets.only(
77-
top: 90.0 + Screen.statusBarHeight,
76+
final edgeH16T136B24WithStatusBar = EdgeInsets.only(
77+
top: 136.0 + Screen.statusBarHeight,
7878
left: 16.0,
7979
right: 16.0,
8080
bottom: 24.0,

lib/ui/fragments/search_fragment.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ class SearchFragment extends StatelessWidget {
102102
childCount: records!.length,
103103
),
104104
gridDelegate: const SliverGridDelegateWithMinCrossAxisExtent(
105-
minCrossAxisExtent: 360.0,
105+
minCrossAxisExtent: 400.0,
106106
mainAxisSpacing: 16.0,
107107
crossAxisSpacing: 16.0,
108108
mainAxisExtent: 150.0,

lib/ui/fragments/subgroup_bangumis_fragment.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class SubgroupBangumisFragment extends StatelessWidget {
8282
shouldRebuild: (pre, next) => pre.ne(next),
8383
builder: (_, records, __) {
8484
return SmartRefresher(
85-
controller: bangumiModel.refreshController,
85+
controller: bangumiModel.subgroupRefreshController,
8686
enablePullDown: false,
8787
enablePullUp: true,
8888
onLoading: () => bangumiModel.loadSubgroupList(dataId),
@@ -111,7 +111,7 @@ class SubgroupBangumisFragment extends StatelessWidget {
111111
);
112112
},
113113
gridDelegate: const SliverGridDelegateWithMinCrossAxisExtent(
114-
minCrossAxisExtent: 360.0,
114+
minCrossAxisExtent: 400.0,
115115
mainAxisSpacing: 16.0,
116116
crossAxisSpacing: 16.0,
117117
mainAxisExtent: 150.0,

lib/ui/fragments/subscribed_fragment.dart

+11-7
Original file line numberDiff line numberDiff line change
@@ -341,9 +341,10 @@ class SubscribedFragment extends StatelessWidget {
341341
padding: edgeH16V8,
342342
sliver: SliverGrid(
343343
gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
344-
maxCrossAxisExtent: 160.0,
344+
maxCrossAxisExtent: 108.0,
345345
crossAxisSpacing: 12.0,
346346
mainAxisSpacing: 12.0,
347+
childAspectRatio: 0.8,
347348
),
348349
delegate: SliverChildBuilderDelegate(
349350
(context, index) {
@@ -491,11 +492,14 @@ class SubscribedFragment extends StatelessWidget {
491492
),
492493
),
493494
sizedBoxH8,
494-
Text(
495-
records.first.name,
496-
maxLines: 1,
497-
overflow: TextOverflow.ellipsis,
498-
style: textStyle15B500,
495+
Tooltip(
496+
message: records.first.name,
497+
child: Text(
498+
records.first.name,
499+
maxLines: 1,
500+
overflow: TextOverflow.ellipsis,
501+
style: textStyle15B500,
502+
),
499503
)
500504
],
501505
);
@@ -577,7 +581,7 @@ class SubscribedFragment extends StatelessWidget {
577581
childCount: records!.length,
578582
),
579583
gridDelegate: const SliverGridDelegateWithMinCrossAxisExtent(
580-
minCrossAxisExtent: 360.0,
584+
minCrossAxisExtent: 400.0,
581585
crossAxisSpacing: 12.0,
582586
mainAxisSpacing: 12.0,
583587
mainAxisExtent: 170.0,

0 commit comments

Comments
 (0)