跟我学企业级flutter项目:dio网络框架增加公共请求参数&header

前言

在开发过程中,我们经常会用到网络请求,在flutter框架中,dio框架非常不错,所以今天的文章在dio的基础上搭建一套网络持久化框架,那么在flutter项目中如何搭建一套,高可用性,维护性较高的dio公共请求参数框架呢?

搭建前夕准备

一、基本认知

  1. 要持久化那么必然要有存储设备
  2. 持久化的数据在app启动后要即使填充到项目中
  3. 由于项目中网络请求地址繁多,类型不同,需要持久化的位置不同

二、基于基本认知来找合适的工具&必要点

2.1 持久化的工具:

我的推荐

  1. mmkv
  2. share_prefresence

今天主要用讲解mmkv版本

2.2必要点:

dio拦截器

拦截器是搭建这套持久化的关键

三、准备好如上技能,我们来搭建这套持久化网络框架吧

1、首先要知道有几种类型的公共

  //请求中url后追加公共请求
  static const int urlPresistent = 1;
  //请求头中追加公共请求
  static const int headerPresistent = 2;
  //全部都追加公共请求
  static const int allPresistent = 3;

2、构建缓存参数(为了快速获取)

  static Map<String,Map<String, String?>> headerPersistent = Map();
  static Map<String,Map<String, String?>> urlPersistent = Map();

3、构建mmkv存储结构(加密存储)

static MMKV _store(String baseUrl, int type) => MMKVStore.sysSafeMMKV(name: '${SysConfig.sysPersistent}${baseUrl}_${type.toString()}');

4、构建基本函数

单健值对存储

static void setPersistent(String baseUrl,String key,String? value,{int type = allPresistent}){
    if (type == allPresistent || type == headerPresistent) {
      if (!headerPersistent.containsKey(baseUrl)) {
        headerPersistent[baseUrl] = Map<String, String?>();
      }
      var keyMap = headerPersistent[baseUrl]!;
      keyMap[key] = value;
      _store(baseUrl, headerPresistent).encodeString(key, value??"");
    }
    if (type == allPresistent || type == urlPresistent) {
      if (!urlPersistent.containsKey(baseUrl)) {
        urlPersistent[baseUrl] = Map<String, String?>();
      }
      var keyMap = urlPersistent[baseUrl]!;
      keyMap[key] = value;
      _store(baseUrl, urlPresistent).encodeString(key, value??"");
    }
  }

多健值对存储

static void setPersistentMap(String baseUrl,Map<String, String?> map,{int type = allPresistent}){
    if (type == allPresistent || type == headerPresistent) {
      if (!headerPersistent.containsKey(baseUrl)) {
        headerPersistent[baseUrl] = Map<String, String?>();
      }
      var keyMap = headerPersistent[baseUrl]!;
      keyMap.addAll(map);
      keyMap.forEach((key, value) {
        _store(baseUrl, headerPresistent).encodeString(key, value??"");
      });
    }
    if (type == allPresistent || type == urlPresistent) {
      if (!urlPersistent.containsKey(baseUrl)) {
        urlPersistent[baseUrl] = Map<String, String?>();
      }
      var keyMap = urlPersistent[baseUrl]!;
      keyMap.addAll(map);
      keyMap.forEach((key, value) {
        _store(baseUrl, urlPresistent).encodeString(key, value??"");
      });
    }
  }

参数获取:

  static Map<String, String?>? getPersistent(String baseUrl, {int type = allPresistent}) {
    Map<String, String?>? map;
    if (type == allPresistent || type == headerPresistent) {
      Map<String, String?>? headerMap;
      if (headerPersistent.containsKey(baseUrl)) {
        headerMap = headerPersistent[baseUrl];
      } else {
        headerMap = null;
      }
      if (headerMap != null) {
        if (map == null) {
          map = Map();
        }
        map.addAll(headerMap);
      }
    }
    if (type == allPresistent || type == urlPresistent) {
      Map<String, String?>? urlMap;
      if (urlPersistent.containsKey(baseUrl)) {
        urlMap = urlPersistent[baseUrl];
      } else {
        urlMap = null;
      }

      if (urlMap != null) {
        if (map == null) {
          map = Map();
        }
        map.addAll(urlMap);
      }
    }
    return map;
  }

刷新当前缓存(应用启动刷新)

  static Map<String, String?> _all(String baseurl, int type) {
    var mmkv= _store(baseurl, type);
    var keys = mmkv.allKeys;
    var map = Map<String, String?>();
    keys.forEach((element) {
      var value = mmkv.decodeString(element);
      map[element] = value;
    });
    return map;
  }

  static void flushPersistent(String baseurl, {int type = allPresistent}) {
    if (type == allPresistent || type == headerPresistent) {
      var map = _all(baseurl, headerPresistent);
      headerPersistent[baseurl]?.clear();

      if (!headerPersistent.containsKey(baseurl)) {
        headerPersistent[baseurl] = Map<String, String?>();
      }
      var keyMap = headerPersistent[baseurl]!;
      keyMap.addAll(map);
    }
    if (type == allPresistent || type == urlPresistent) {
      var map = _all(baseurl, urlPresistent);
      urlPersistent[baseurl]?.clear();
      if (!urlPersistent.containsKey(baseurl)) {
        urlPersistent[baseurl] = Map<String, String?>();
      }
      var keyMap = urlPersistent[baseurl]!;
      keyMap.addAll(map);
    }

  }

退出登陆移除持久化

static void removeAllPersistent(String baseurl, {int type = allPresistent}) {
    if (type == allPresistent || type == headerPresistent) {
      headerPersistent[baseurl]?.clear();
      _store(baseurl, headerPresistent).clearAll();
    }
    if (type == allPresistent || type == urlPresistent) {
      urlPersistent[baseurl]?.clear();
      _store(baseurl, urlPresistent).clearAll();
    }
  }

拦截器实现(dio请求拦截管理)

class PresistentInterceptor extends Interceptor {

  @override
  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
    var urlPersitents = HttpPersistent.getPersistent(options.baseUrl,type: HttpPersistent.urlPresistent);
    var headerPersitents = HttpPersistent.getPersistent(options.baseUrl,
        type: HttpPersistent.headerPresistent);
    headerPersitents?.forEach((key, value) {
      options.headers[key] = value;
    });

    urlPersitents?.forEach((key, value) {
      options.queryParameters[key] = value;
    });
    super.onRequest(options, handler);
  }

}

四、整体代码&事件调用逻辑

整体代码


class HttpPersistent{

  static const int urlPresistent = 1;
  static const int headerPresistent = 2;
  static const int allPresistent = 3;

  static MMKV _store(String baseUrl, int type) => MMKVStore.sysSafeMMKV(name: '${SysConfig.sysPersistent}${baseUrl}_${type.toString()}');
  static Map<String,Map<String, String?>> headerPersistent = Map();
  static Map<String,Map<String, String?>> urlPersistent = Map();

  static void setPersistent(String baseUrl,String key,String? value,{int type = allPresistent}){
    if (type == allPresistent || type == headerPresistent) {
      if (!headerPersistent.containsKey(baseUrl)) {
        headerPersistent[baseUrl] = Map<String, String?>();
      }
      var keyMap = headerPersistent[baseUrl]!;
      keyMap[key] = value;
      _store(baseUrl, headerPresistent).encodeString(key, value??"");
    }
    if (type == allPresistent || type == urlPresistent) {
      if (!urlPersistent.containsKey(baseUrl)) {
        urlPersistent[baseUrl] = Map<String, String?>();
      }
      var keyMap = urlPersistent[baseUrl]!;
      keyMap[key] = value;
      _store(baseUrl, urlPresistent).encodeString(key, value??"");
    }
  }

  static void setPersistentMap(String baseUrl,Map<String, String?> map,{int type = allPresistent}){
    if (type == allPresistent || type == headerPresistent) {
      if (!headerPersistent.containsKey(baseUrl)) {
        headerPersistent[baseUrl] = Map<String, String?>();
      }
      var keyMap = headerPersistent[baseUrl]!;
      keyMap.addAll(map);
      keyMap.forEach((key, value) {
        _store(baseUrl, headerPresistent).encodeString(key, value??"");
      });
    }
    if (type == allPresistent || type == urlPresistent) {
      if (!urlPersistent.containsKey(baseUrl)) {
        urlPersistent[baseUrl] = Map<String, String?>();
      }
      var keyMap = urlPersistent[baseUrl]!;
      keyMap.addAll(map);
      keyMap.forEach((key, value) {
        _store(baseUrl, urlPresistent).encodeString(key, value??"");
      });
    }
  }

  static Map<String, String?>? getPersistent(String baseUrl, {int type = allPresistent}) {
    Map<String, String?>? map;
    if (type == allPresistent || type == headerPresistent) {
      Map<String, String?>? headerMap;
      if (headerPersistent.containsKey(baseUrl)) {
        headerMap = headerPersistent[baseUrl];
      } else {
        headerMap = null;
      }
      if (headerMap != null) {
        if (map == null) {
          map = Map();
        }
        map.addAll(headerMap);
      }
    }
    if (type == allPresistent || type == urlPresistent) {
      Map<String, String?>? urlMap;
      if (urlPersistent.containsKey(baseUrl)) {
        urlMap = urlPersistent[baseUrl];
      } else {
        urlMap = null;
      }

      if (urlMap != null) {
        if (map == null) {
          map = Map();
        }
        map.addAll(urlMap);
      }
    }
    return map;
  }

  static Map<String, String?> _all(String baseurl, int type) {
    var mmkv= _store(baseurl, type);
    var keys = mmkv.allKeys;
    var map = Map<String, String?>();
    keys.forEach((element) {
      var value = mmkv.decodeString(element);
      map[element] = value;
    });
    return map;
  }

  static void flushPersistent(String baseurl, {int type = allPresistent}) {
    if (type == allPresistent || type == headerPresistent) {
      var map = _all(baseurl, headerPresistent);
      headerPersistent[baseurl]?.clear();

      if (!headerPersistent.containsKey(baseurl)) {
        headerPersistent[baseurl] = Map<String, String?>();
      }
      var keyMap = headerPersistent[baseurl]!;
      keyMap.addAll(map);
    }
    if (type == allPresistent || type == urlPresistent) {
      var map = _all(baseurl, urlPresistent);
      urlPersistent[baseurl]?.clear();
      if (!urlPersistent.containsKey(baseurl)) {
        urlPersistent[baseurl] = Map<String, String?>();
      }
      var keyMap = urlPersistent[baseurl]!;
      keyMap.addAll(map);
    }

  }

  static void removeAllPersistent(String baseurl, {int type = allPresistent}) {
    if (type == allPresistent || type == headerPresistent) {
      headerPersistent[baseurl]?.clear();
      _store(baseurl, headerPresistent).clearAll();
    }
    if (type == allPresistent || type == urlPresistent) {
      urlPersistent[baseurl]?.clear();
      _store(baseurl, urlPresistent).clearAll();
    }
  }
}



class PresistentInterceptor extends Interceptor {

  @override
  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
    var urlPersitents = HttpPersistent.getPersistent(options.baseUrl,type: HttpPersistent.urlPresistent);
    var headerPersitents = HttpPersistent.getPersistent(options.baseUrl,
        type: HttpPersistent.headerPresistent);
    headerPersitents?.forEach((key, value) {
      options.headers[key] = value;
    });

    urlPersitents?.forEach((key, value) {
      options.queryParameters[key] = value;
    });
    super.onRequest(options, handler);
  }

}

1、登陆后,调用存储
HttpPersistent.setPersistent("http://www.baidu.com","token","123",HttpPersistent.headerPresistent)
2、退出登陆后,调用移除
HttpPersistent.removeAllPersistent("http://www.baidu.com",,type: HttpPersistent.headerPresistent);
3、应用启动后刷新缓存
HttpPersistent.flushPersistent("http://www.baidu.com",
type: HttpPersistent.headerPresistent);

五、大功告成

如上就构建出一套可靠性高,维护性高的网络持久化框架

更多flutter教程请关注我的IMGeek:https://www.imgeek.org/people/33692

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容