推荐学习项目
- Flutter高级进阶(Flutter技术进阶开源电子书)
- Flutter教程网(不定时更新Flutter技术文章)
- Flutter版本微信 (目前已修复Flutter版本兼容问题)
- nav_router (flutter最简单/轻量/便捷的路由管理方案)
- FlutterCandies全家桶 (各种优秀的轮子)
- Flutter开发肺炎相关实时动态更新App(开源项目)
flutter相关
Log
- 2020.2.2 - 修复了统计的分隔符导致统计数据无法正常显示。
App体验
Android 下载地址:
http://www.flutterj.com/nCoV-2019.apk
Android(二维码下载):
download.pngIOS:
拉下代码直接跑即可
开头
这段时间肺炎比较严重,大家记得戴口罩。
大家好,我又来蹭热点了。
1.26日02:00看到了:
从而有了这篇文章。
感同深受:
我不是什么专业人士,也无法贡献医疗力量,只能尽我所能看是否能为这件事做一点点的贡献。
还有就是始终无法劝动父母戴口罩,我爸今天还打牌到凌晨2点左右才回来,他去之前我都跟他约定好了,我不去网吧上网了,他也别去打牌了,并讲述了这次疫情的重要性,
无果。
资讯来源:
App内所有资讯来自人民日报和丁香医生,官方实时动态更新,经验证。
介绍
本次App研发主要采用dart语言,flutter框架,MVVM架构设计,采用上文提供的接口进行开发,代码非常简洁可观,注释明确。
App页面
home.png | rumor1.png | rumor2.png | rumor3.png |
---|---|---|---|
protect1.png | protect2.png | protect3.png | lore.png |
项目结构
imageMVVM架构设计
封装了请求Model和ViewModel;
-
请求Model示例:
image -
ViewModel示例:
image -
JsonModel:
image
View层暂无,所以还不算完整,待更新
请求封装
// 请求计数
var _id = 0;
/*
* 请求类型枚举
* */
enum RequestType { GET, POST }
class ReqModel {
///连接超时时间为5秒
static const int connectTimeOut = 5 * 1000;
///响应超时时间为7秒
static const int receiveTimeOut = 7 * 1000;
// 请求url路径
String url() => null;
// 请求参数
Map params() => {};
/*
* get请求
* */
Future<dynamic> get() async {
return this._request(
url: url(),
method: RequestType.GET,
params: params(),
);
}
/*
* post请求
* */
Future post() async {
return this._request(
url: url(),
method: RequestType.POST,
params: params(),
);
}
/*
* post请求-文件上传方式
* */
Future postUpload(
ProgressCallback progressCallBack, {
FormData formData,
}) async {
return this._request(
url: url(),
method: RequestType.POST,
formData: formData,
progressCallBack: progressCallBack,
params: params(),
);
}
/*
* 请求方法
* */
Future _request({
String url,
RequestType method,
Map params,
FormData formData,
ProgressCallback progressCallBack,
}) async {
Dio _client;
final httpUrl = '$reqUrl$url';
if (_client == null) {
BaseOptions options = new BaseOptions();
options.connectTimeout = connectTimeOut;
options.receiveTimeout = receiveTimeOut;
options.headers = const {'Content-Type': 'application/json'};
options.baseUrl = reqUrl;
_client = new Dio(options);
}
final id = _id++;
int statusCode;
try {
Response response;
if (method == RequestType.GET) {
///组合GET请求的参数
if (mapNoEmpty(params)) {
response = await _client.get(
url,
queryParameters: params,
);
} else {
response = await _client.get(
url,
);
}
} else {
if (mapNoEmpty(params) && formData.isNotEmpty) {
response = await _client.post(
url,
data: formData ?? params,
onSendProgress: progressCallBack,
);
} else {
response = await _client.post(
url,
);
}
}
statusCode = response.statusCode;
if (response != null) {
print('HTTP_REQUEST_URL::[$id]::$httpUrl');
if (mapNoEmpty(params)) print('HTTP_REQUEST_BODY::[$id]::$params');
print('HTTP_RESPONSE_BODY::[$id]::${json.encode(response.data)}');
return response.data;
}
///处理错误部分
if (statusCode < 0) {
return _handError(statusCode);
}
} catch (e) {
return _handError(statusCode);
}
}
///处理异常
static Future _handError(int statusCode) {
String errorMsg = 'Network request error';
Map errorMap = {"errorMsg": errorMsg, "errorCode": statusCode};
print("HTTP_RESPONSE_ERROR::$errorMsg code:$statusCode");
return Future.value(errorMap);
}
}
关于接口
- 地址:http://49.232.173.220:3001
- 测试:http://49.232.173.220:3001/data/getTimelineService
带参数例子:
来自普通程序员,
链接:https://juejin.im/post/5e2c6a6e51882526b757cf2e
关于项目
项目在不断更新,目前架构和请求等数据处理方式已封装完毕。
正在进行View层和推送的开发。
接口作者(普通程序员)也在不段优化和更新,在此致敬!
项目地址
App项目:
接口项目:
意见反馈
如果大家有好的意见或者有好的设计图的话可以群内找我。
Flutter交流QQ群:874592746
Flutter交流微信群:
image
网友评论