推薦學習專案
- Flutter高階進階(Flutter技術進階開源電子書)
- Flutter教程網(不定時更新Flutter技術文章)
- Flutter版本微信 (目前已修復Flutter版本相容問題)
- nav_router (flutter最簡單/輕量/便捷的路由管理方案)
- FlutterCandies全家桶 (各種優秀的輪子)
- Flutter開發肺炎相關實時動態更新App(開源專案)
flutter相關
Log
- 2020.2.2 - 修復了統計的分隔符導致統計資料無法正常顯示。
App體驗
Android 下載地址:
Android(二維碼下載):
IOS: 拉下程式碼直接跑即可
開頭
這段時間肺炎比較嚴重,大家記得戴口罩
大家好,我又來蹭熱點了。
1.26日02:00看到了:
從而有了這篇文章。
感同深受:
我不是什麼專業人士,也無法貢獻醫療力量,只能盡我所能看是否能為這件事做一點點的貢獻。
還有就是始終無法勸動父母戴口罩,我爸今天還打牌到凌晨2點左右才回來,他去之前我都跟他約定好了,我不去網咖上網了,他也別去打牌了,並講述了這次疫情的重要性, 無果。
資訊來源:
App內所有資訊來自人民日報和丁香醫生,官方實時動態更新,經驗證。
介紹
本次App研發主要採用dart語言,flutter框架,MVVM架構設計,採用上文提供的介面進行開發,程式碼非常簡潔可觀,註釋明確。
App頁面
專案結構
MVVM架構設計
封裝了請求Model和ViewModel;
- 請求Model示例:
- ViewModel示例:
- JsonModel:
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);
}
}
複製程式碼
關於介面
帶引數例子:
來自普通程式設計師, 連結:juejin.im/post/5e2c6a…
關於專案
專案在不斷更新,目前架構和請求等資料處理方式已封裝完畢。
正在進行View層和推送的開發。
介面作者(普通程式設計師)也在不段優化和更新,在此致敬!
專案地址
App專案:
介面專案:
意見反饋
如果大家有好的意見或者有好的設計圖的話可以群內找我。
Flutter交流QQ群:874592746
Flutter交流微信群: