美文网首页All in FlutterFlutter圈子Flutter教程网
为抗击新肺炎贡献一份技术力量-App研发

为抗击新肺炎贡献一份技术力量-App研发

作者: CrazyQ1 | 来源:发表于2020-02-02 10:24 被阅读0次

    推荐学习项目

    flutter相关

    Log

    • 2020.2.2 - 修复了统计的分隔符导致统计数据无法正常显示。

    App体验

    Android 下载地址:

    http://www.flutterj.com/nCoV-2019.apk

    Android(二维码下载):
    download.png

    IOS:
    拉下代码直接跑即可

    开头

    这段时间肺炎比较严重,大家记得戴口罩。

    大家好,我又来蹭热点了。

    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

    项目结构

    image

    MVVM架构设计

    封装了请求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);
      }
    }
    

    关于接口

    带参数例子:

    来自普通程序员,
    链接:https://juejin.im/post/5e2c6a6e51882526b757cf2e

    关于项目

    项目在不断更新,目前架构和请求等数据处理方式已封装完毕。

    正在进行View层和推送的开发。

    接口作者(普通程序员)也在不段优化和更新,在此致敬!

    项目地址

    App项目:
    接口项目:

    意见反馈

    如果大家有好的意见或者有好的设计图的话可以群内找我。

    Flutter交流QQ群:874592746

    Flutter交流微信群:

    image

    相关文章

      网友评论

        本文标题:为抗击新肺炎贡献一份技术力量-App研发

        本文链接:https://www.haomeiwen.com/subject/afnfxhtx.html