Skip to content

Commit 4e7f3d5

Browse files
committed
更新首页网络异常时,根据当前页面是否有数据,来决定是否跳转错误页面
更新首页刷新时的indicator的颜色 其他页面待下周修改
1 parent b78fe18 commit 4e7f3d5

File tree

10 files changed

+99
-25
lines changed

10 files changed

+99
-25
lines changed

lib/config/net/wan_android_api.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class ApiInterceptor extends InterceptorsWrapper {
3131

3232
@override
3333
onResponse(Response response) {
34+
// debugPrint('---api-response--->resp----->${response.data}');
3435
ResponseData respData = ResponseData.fromJson(response.data);
3536
if (respData.success) {
3637
response.data = respData.data;

lib/provider/view_state_list_model.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ abstract class ViewStateListModel<T> extends ViewStateModel {
1414
// 下拉刷新
1515
refresh({bool init = false}) async {
1616
try {
17-
if (init) list.clear();
1817
List<T> data = await loadData();
1918
if (data.isEmpty) {
2019
list.clear();
@@ -26,8 +25,8 @@ abstract class ViewStateListModel<T> extends ViewStateModel {
2625
setIdle();
2726
}
2827
} catch (e, s) {
29-
list.clear();
30-
setError(e,s);
28+
if (init) list.clear();
29+
setError(e, s);
3130
}
3231
}
3332

lib/provider/view_state_model.dart

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import 'package:dio/dio.dart';
22
import 'package:flutter/material.dart';
33
import 'package:fun_android/config/net/api.dart';
4+
import 'package:fun_android/generated/i18n.dart';
5+
import 'package:oktoast/oktoast.dart';
46

57
import 'view_state.dart';
68

@@ -30,6 +32,8 @@ class ViewStateModel with ChangeNotifier {
3032

3133
ViewStateError get viewStateError => _viewStateError;
3234

35+
36+
3337
String get errorMessage => _viewStateError?.message;
3438

3539
/// 以下变量是为了代码书写方便,加入的get方法.严格意义上讲,并不严谨
@@ -61,6 +65,9 @@ class ViewStateModel with ChangeNotifier {
6165
onUnAuthorizedException();
6266
}
6367

68+
/// 未授权的回调
69+
void onUnAuthorizedException() {}
70+
6471
/// [e]分类Error和Exception两种
6572
void setError(e, stackTrace, {String message}) {
6673
ErrorType errorType = ErrorType.defaultError;
@@ -87,8 +94,17 @@ class ViewStateModel with ChangeNotifier {
8794
printErrorStack(e, stackTrace);
8895
}
8996

90-
/// 未授权的回调
91-
void onUnAuthorizedException() {}
97+
/// 显示错误消息
98+
showErrorMessage(context, {String networkErrorMessage}) {
99+
var message = viewStateError.message;
100+
if (viewStateError.isNetworkError) {
101+
message =
102+
networkErrorMessage ?? S.of(context).viewStateMessageNetworkError;
103+
}
104+
Future.microtask((){
105+
showToast(message, context: context);
106+
});
107+
}
92108

93109
@override
94110
String toString() {

lib/provider/view_state_refresh_list_model.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@ abstract class ViewStateRefreshListModel<T> extends ViewStateListModel<T> {
2020
int _currentPageNum = pageNumFirst;
2121

2222
/// 下拉刷新
23+
///
24+
/// [init] 是否是第一次加载
25+
/// true: Error时,需要跳转页面
26+
/// false: Error时,不需要跳转页面,直接给出提示
2327
Future<List<T>> refresh({bool init = false}) async {
2428
try {
2529
_currentPageNum = pageNumFirst;
26-
if (init) list.clear();
2730
var data = await loadData(pageNum: pageNumFirst);
2831
if (data.isEmpty) {
2932
refreshController.refreshCompleted(resetFooterState: true);
@@ -45,7 +48,10 @@ abstract class ViewStateRefreshListModel<T> extends ViewStateListModel<T> {
4548
}
4649
return data;
4750
} catch (e, s) {
48-
list.clear();
51+
/// 页面已经加载了数据,如果刷新报错,不应该直接跳转错误页面
52+
/// 而是显示之前的页面数据.给出错误提示
53+
if (init) list.clear();
54+
refreshController.refreshFailed();
4955
setError(e, s);
5056
return null;
5157
}

lib/ui/helper/refresh_helper.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
import 'package:flutter/cupertino.dart';
12
import 'package:flutter/material.dart';
23
import 'package:fun_android/generated/i18n.dart';
34
import 'package:fun_android/ui/page/tab/home_second_floor_page.dart';
5+
import 'package:fun_android/ui/widget/activity_indicator.dart';
46
import 'package:pull_to_refresh/pull_to_refresh.dart';
57

68
/// 首页列表的header
@@ -15,6 +17,7 @@ class HomeRefreshHeader extends StatelessWidget {
1517
outerBuilder: (child) => HomeSecondFloorOuter(child),
1618
twoLevelView: Container(),
1719
height: 70 + MediaQuery.of(context).padding.top / 3,
20+
refreshingIcon: ActivityIndicator(brightness: Brightness.dark),
1821
releaseText: strings.canRefreshText+',继续下拉触发惊喜',
1922
);
2023
}

lib/ui/page/tab/home_page.dart

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class _HomePageState extends State<HomePage>
5656
context: context,
5757
removeTop: false,
5858
child: Builder(builder: (_) {
59-
if (homeModel.error) {
59+
if (homeModel.error && homeModel.list.isEmpty) {
6060
return AnnotatedRegion<SystemUiOverlayStyle>(
6161
value: StatusBarUtils.systemUiOverlayStyle(context),
6262
child: ViewStateErrorWidget(
@@ -70,11 +70,11 @@ class _HomePageState extends State<HomePage>
7070
//最大下拉距离,android默认为0,这里为了触发二楼
7171
maxOverScrollExtent: kHomeRefreshHeight,
7272
headerTriggerDistance:
73-
80 + MediaQuery.of(context).padding.top/3,
73+
80 + MediaQuery.of(context).padding.top / 3,
7474
child: SmartRefresher(
7575
controller: homeModel.refreshController,
7676
header: HomeRefreshHeader(),
77-
enableTwoLevel: homeModel.idle,
77+
enableTwoLevel: homeModel.list.isNotEmpty,
7878
onTwoLevel: () async {
7979
await Navigator.of(context)
8080
.pushNamed(RouteName.homeSecondFloor);
@@ -84,7 +84,7 @@ class _HomePageState extends State<HomePage>
8484
.twoLevelComplete();
8585
},
8686
footer: RefresherFooter(),
87-
enablePullDown: homeModel.idle,
87+
enablePullDown: homeModel.list.isNotEmpty,
8888
onRefresh: homeModel.refresh,
8989
onLoading: homeModel.loadMore,
9090
enablePullUp: homeModel.list.isNotEmpty,
@@ -135,7 +135,8 @@ class _HomePageState extends State<HomePage>
135135
child: ViewStateEmptyWidget(
136136
onPressed: homeModel.initData),
137137
)),
138-
if (homeModel.idle) HomeTopArticleList(),
138+
if (homeModel.topArticles?.isNotEmpty ?? false)
139+
HomeTopArticleList(),
139140
HomeArticleList(),
140141
],
141142
)),

lib/ui/page/user/login_page.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,7 @@ class LoginButton extends StatelessWidget {
137137
if (value) {
138138
Navigator.of(context).pop(true);
139139
} else {
140-
showToast(model.viewStateError.isNetworkError
141-
? S.of(context).viewStateMessageNetworkError
142-
: model.errorMessage);
140+
model.showErrorMessage(context);
143141
}
144142
});
145143
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import 'package:flutter/cupertino.dart';
2+
import 'package:flutter/material.dart';
3+
4+
/// 由于app不管明暗模式,都是有底色
5+
/// 所以将indicator颜色为亮色
6+
class ActivityIndicator extends StatelessWidget {
7+
final double radius;
8+
final Brightness brightness;
9+
10+
ActivityIndicator({this.radius, this.brightness});
11+
12+
@override
13+
Widget build(BuildContext context) {
14+
return Theme(
15+
data: ThemeData(
16+
cupertinoOverrideTheme: CupertinoThemeData(brightness: brightness),
17+
),
18+
child: CupertinoActivityIndicator(radius: radius ?? 10));
19+
}
20+
}

lib/ui/widget/app_bar.dart

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
1-
import 'package:flutter/cupertino.dart';
21
import 'package:flutter/material.dart';
2+
import 'package:fun_android/ui/widget/activity_indicator.dart';
33

44
/// 由于app不管明暗模式,都是有底色
55
/// 所以将indicator颜色为亮色
66
class AppBarIndicator extends StatelessWidget {
77
final double radius;
88

9-
AppBarIndicator({this.radius:10});
9+
AppBarIndicator({this.radius});
1010

1111
@override
1212
Widget build(BuildContext context) {
13-
return Theme(
14-
data: ThemeData(
15-
cupertinoOverrideTheme:
16-
CupertinoThemeData(brightness: Brightness.dark)),
17-
child: CupertinoActivityIndicator(radius: radius));
13+
return ActivityIndicator(
14+
brightness: Brightness.dark,
15+
radius: radius,
16+
);
1817
}
1918
}

test/widget_test.dart

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,40 @@ void main() {
2525
// expect(find.text('1'), findsOneWidget);
2626
// });
2727

28-
test(('reg'), () {
29-
String title = r"在Java 中<em class='highlight'>安全</em>使用接口引用";
28+
test(('copy array'), () {
29+
var a = [1000000000, 2, 3];
30+
var b = [...a];
31+
a[0] = 111;
32+
print(a);
33+
print(b);
3034

31-
print(title.replaceAll(RegExp("<[^>]+>"), ''));
35+
var aa = ['我还没改名1', '我还没改名2','我还没改名3'];
36+
var bb = [...aa];
37+
aa[0] = '我已经改名啦1';
38+
print(aa);
39+
print(bb);
40+
41+
// var aa = [Person('11'),Person('22'),Person('33')];
42+
43+
var aaa = [
44+
Person('111'),
45+
Person('222'),
46+
Person('222')
47+
];
48+
var bbb = [...aaa];
49+
aaa[0].name = '我要改名了';
50+
print(aaa);
51+
print(bbb);
3252
});
3353
}
54+
55+
class Person {
56+
String name;
57+
58+
Person(this.name);
59+
60+
@override
61+
String toString() {
62+
return 'Person{name: $name}';
63+
}
64+
}

0 commit comments

Comments
 (0)