forked from zhujian1989/flutter_study
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnetwork_page.dart
204 lines (166 loc) · 5.48 KB
/
network_page.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
import 'dart:convert';
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_study/common/constant.dart';
import 'package:flutter_study/model/ai_model.dart';
import 'package:flutter_study/model/hot_news_model.dart';
import 'package:http/http.dart' as http;
class NetworkAppPage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return new _NetworkAppPageState();
}
}
class _NetworkAppPageState extends State<NetworkAppPage> {
var _result = '';
var _decodeResult = '';
//使用系统的请求
var httpClient = new HttpClient();
var dio_url = 'https://news-at.zhihu.com/api/4/news/latest';
var url = Constant.baseUrl + 'Android/1/1';
_loadData() async {
try {
var request = await httpClient.getUrl(Uri.parse(url));
var response = await request.close();
if (response.statusCode == HttpStatus.OK) {
_result = await response.transform(Utf8Decoder()).join();
_decodeJson(_result, false);
} else {
_result = 'error code : ${response.statusCode}';
}
} catch (exception) {
_result = '网络异常';
}
// If the widget was removed from the tree while the message was in flight,
// we want to discard the reply rather than calling setState to update our
// non-existent appearance.
if (!mounted) return;
setState(() {});
}
//使用第三方库Http的请求
var client = new http.Client();
_loadDataByHttp() async {
try {
http.Response response = await client.get(url);
if (response.statusCode == HttpStatus.OK) {
if (response.statusCode == HttpStatus.OK) {
_result = response.body.toString();
_decodeJson(_result, false);
} else {
_result = 'error code : ${response.statusCode}';
}
} else {
_result = 'error code : ${response.statusCode}';
}
} catch (exception) {
_result = '网络异常';
}
setState(() {});
}
//使用第三方库Dio的请求
Dio dio = new Dio();
_loadDataByDio() async {
try {
Response response = await dio.get(dio_url);
if (response.statusCode == HttpStatus.OK) {
_result = response.data.toString();
_decodeTest(response.data);
} else {
_result = 'error code : ${response.statusCode}';
}
} catch (exception) {
print('exc:$exception');
_result = '网络异常';
}
setState(() {});
}
_decodeTest(var body) {
String date = body['date'];
List stories = body['stories'];
List topStories = body['top_stories'];
List<HotNewsStoriesModel> storiesList = stories.map((model) {
return new HotNewsStoriesModel.fromJson(model);
}).toList();
List<HotNewsTopStoriesModel> topStoriesList = topStories.map((model) {
return new HotNewsTopStoriesModel.fromJson(model);
}).toList();
HotNewsModel hotNewsModel = new HotNewsModel(
date: date, stories: storiesList, top_stories: topStoriesList);
print(topStoriesList.length);
print(storiesList.length);
storiesList.forEach((model) => print('${model.images}:${model.id}:${model.title}:${model.type}'));
}
_decodeJson(var body, bool isDio) {
var json;
if (isDio) {
//如果是Dio则不需要jsonDecode
json = body;
} else {
json = jsonDecode(body);
}
List flModels = json['results'];
List<AIModel> list = flModels.map((model) {
return new AIModel.fromJson(model);
}).toList();
for (AIModel model in list) {
_decodeResult =
'作者:${model.who}\n描述:${model.desc}\n地址:${model.url}\n时间:${DateTime.parse(
model.publishedAt)}';
}
setState(() {});
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return new Scaffold(
appBar: new AppBar(
title: new Text('网络请求 学习'),
centerTitle: true,
),
body: new ListView(
children: <Widget>[
new Padding(
padding: const EdgeInsets.only(left: 10.0, top: 10.0, right: 10.0),
child: new RaisedButton(
textColor: Colors.black,
child: new Text('不使用第三方库加载数据'),
onPressed: _loadData),
),
new Padding(
padding: const EdgeInsets.only(left: 10.0, top: 10.0, right: 10.0),
child: new RaisedButton(
textColor: Colors.black,
child: new Text('使用第三方库http加载数据'),
onPressed: _loadDataByHttp),
),
new Padding(
padding: const EdgeInsets.only(left: 10.0, top: 10.0, right: 10.0),
child: new RaisedButton(
textColor: Colors.black,
child: new Text('使用第三方库dio加载数据'),
onPressed: _loadDataByDio),
),
new Padding(
padding: const EdgeInsets.only(left: 10.0, top: 10.0, right: 10.0),
child: new Text('原始数据:\n$_result'),
),
new Padding(
padding: const EdgeInsets.only(left: 10.0, top: 10.0, right: 10.0),
child: new Text('解析后的数据:\n$_decodeResult'),
),
],
),
);
}
}
class NetworkPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return new Scaffold(
body: new NetworkAppPage(),
);
}
}