Flutter框架 進(jìn)階二 Flutter-Habit 網(wǎng)絡(luò)層

Flutter-Habit

network

  • aes 加解密操作
  • entity 基礎(chǔ)實(shí)體類(lèi)
  • interceptor 攔截器
  • http_error 錯(cuò)誤碼
  • net_exception 異常攔截
  • vv_net_work 單例的Dio對(duì)象

Dio配合Charles 抓包配置,ConstantConfig.localProxy配置本機(jī)IP源哩,既可以實(shí)現(xiàn)抓包

 if (ConstantConfig.localProxy.isNotEmpty) {
        (_client.httpClientAdapter as DefaultHttpClientAdapter)
            .onHttpClientCreate = (client) {
          client.badCertificateCallback =
              (X509Certificate cert, String host, int port) {
//          if(cert.pem==PEM){ // Verify the certificate
//            return true;
//          }
            return true;
          };
          client.findProxy = (uri) {
            return ConstantConfig.localProxy;
          };
        };
      }

網(wǎng)絡(luò)取消,結(jié)合ViewModel進(jìn)行取消,具體怎么取消的,記得看源碼

  static Map<String, CancelToken> cancelTokens = new Map<String, CancelToken>();

 ///取消請(qǐng)求
  static void cancelHttp(String tag) {
    if (cancelTokens.containsKey(tag)) {
      if (!cancelTokens[tag].isCancelled) {
        cancelTokens[tag].cancel();
      }
      cancelTokens.remove(tag);
    }
  }

這里有一個(gè)比較重要的操作惜索,就是數(shù)據(jù)解析了。Dart語(yǔ)言沒(méi)有實(shí)際的泛型概念,無(wú)法類(lèi)似Android實(shí)體化泛型命贴,所以咧织,這里我們把數(shù)據(jù)塞進(jìn)BaseResponseEntity嗓袱,通過(guò)解析 var dynamicData = json.decode(decodeData);來(lái)達(dá)到業(yè)務(wù)獲取數(shù)據(jù)

 if (baseResult['code'] == HTTP_SUCCEED) {
        var data = baseResult['data'];
        if (data != null) {
          try {
            //解密
            String decodeData = EncryptUtil.aesDecode(data);
            var dynamicData = json.decode(decodeData);
            print('解密后的數(shù)據(jù)$decodeData');
            BaseResponseEntity<T> baseResEntity = BaseResponseEntity(
                data: dynamicData,
                code: baseResult['code'],
                msg: baseResult['msg'],
                timeStamp: baseResult['timeStamp']);
            return new Future.value(baseResEntity);
          } catch (e) {
            throw (new ResponseException(
                code: baseResult['code'],
                message: e.toString(),
                errorData: baseResult['data']));
          }
        } else {
          throw (new ResponseException(
              code: baseResult['code'],
              message: baseResult['msg'],
              errorData: baseResult['data']));
        }
      }

通過(guò)上述net分析,以及網(wǎng)上大部分人的寫(xiě)法可以知道习绢。使用Dart的時(shí)候渠抹,解析數(shù)據(jù)有點(diǎn)小麻煩,F(xiàn)lutter-Habit通過(guò)JsonConvert.fromJsonAsT闪萄,擴(kuò)展了一個(gè)方法屬性梧却,來(lái)使業(yè)務(wù)更加簡(jiǎn)單

extension NetExtension<T> on Future<BaseResponseEntity<T>> {
  Future<T> check() async {
    var baseResponseEntity = await this;
    return Future.value(JsonConvert.fromJsonAsT<T>(baseResponseEntity.data));
  }
}

用法例子如下:

class LoginModel extends BaseModel {
  Future<LoginRespEntity> login(LoginReqUserEntity loginReqUserEntity) =>
      apiService
          .request<LoginRespEntity>(
            LoginApiService.loginUrl,
            queryParameters: loginReqUserEntity.toJson(),
          )
          .check();
}

在具體的業(yè)務(wù)層使用

  void toLogin(BuildContext context, String account, String password) {
    var loginReqUserEntity = LoginReqUserEntity()
      ..loginName = "123"
      ..password = "456"
      ..organizeType = 3;
    launch(() async {
      var login = await model.login(loginReqUserEntity);
      showToast(login.loginName);
      NavigatorUtils.pushNamed(context, PassWordForgetPage.sName);
    }, (err) {
    });
  }

注意,這里對(duì)launch的封裝,可以全局控制所有異常

  void launch(Future<void> Function() future, HttpFailureCallback err,
      {bool ignoreToast = false,
      bool showLoadingIndicator = false,
      bool isCancelable = true}) {
    future().catchError((onError) {
      ///錯(cuò)誤所有的網(wǎng)絡(luò)異常
      print("啥錯(cuò)誤${onError.toString()}");
      err.call(Exception(
          HttpError.checkNetError(onError, ignoreToast: ignoreToast)));
    });
  }

整體的業(yè)務(wù)結(jié)構(gòu)败去,比較核心的大概就是這兩個(gè)地方了放航。其他的看開(kāi)源的項(xiàng)目吧。
Flutter-Habit

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末为迈,一起剝皮案震驚了整個(gè)濱河市三椿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌葫辐,老刑警劉巖搜锰,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異耿战,居然都是意外死亡蛋叼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)剂陡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)狈涮,“玉大人,你說(shuō)我怎么就攤上這事鸭栖「桠桑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵晕鹊,是天一觀的道長(zhǎng)松却。 經(jīng)常有香客問(wèn)我,道長(zhǎng)溅话,這世上最難降的妖魔是什么晓锻? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮飞几,結(jié)果婚禮上砚哆,老公的妹妹穿的比我還像新娘屑墨。我一直安慰自己躁锁,他們只是感情好纷铣,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布灿里。 她就那樣靜靜地躺著,像睡著了一般匣吊。 火紅的嫁衣襯著肌膚如雪儒拂。 梳的紋絲不亂的頭發(fā)上色鸳,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天社痛,我揣著相機(jī)與錄音,去河邊找鬼命雀。 笑死蒜哀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吏砂。 我是一名探鬼主播撵儿,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼狐血!你這毒婦竟也來(lái)了淀歇?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤匈织,失蹤者是張志新(化名)和其女友劉穎浪默,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體缀匕,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纳决,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乡小。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阔加。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖满钟,靈堂內(nèi)的尸體忽然破棺而出掸哑,到底是詐尸還是另有隱情,我是刑警寧澤零远,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站厌蔽,受9級(jí)特大地震影響牵辣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奴饮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一纬向、第九天 我趴在偏房一處隱蔽的房頂上張望择浊。 院中可真熱鬧,春花似錦逾条、人聲如沸琢岩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)担孔。三九已至,卻和暖如春吃警,著一層夾襖步出監(jiān)牢的瞬間糕篇,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工酌心, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拌消,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓安券,卻偏偏與公主長(zhǎng)得像墩崩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子侯勉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容