Flutter學(xué)習(xí)指南(4):Dart語言(2)---開源網(wǎng)絡(luò)庫dio

dio 是dart 開源的網(wǎng)絡(luò)庫 ,基于dart語言 绕辖。使用簡單摇肌,性能穩(wěn)定 。

一.dio的架構(gòu)

執(zhí)行流:

請求攔截器 >> 請求轉(zhuǎn)換器 >> 發(fā)起請求 >> 響應(yīng)轉(zhuǎn)換器 >> 響應(yīng)攔截器 >> 最終結(jié)果引镊。

支持的功能:

http朦蕴、FormData、攔截器弟头、請求取消吩抓、Cookie管理、文件上傳/下載赴恨、超時(shí)疹娶、錯(cuò)誤處理、轉(zhuǎn)換器伦连、代理雨饺。

二、 開始實(shí)驗(yàn)

1. 引入包

知識點(diǎn):
1.flutter有自己的包管理倉庫 Pub

  1. flutter可以引入 pub包惑淳,本地路徑包额港,git包 ,github包
  2. flutter核心庫不包含顏色歧焦,要使用 css_colors 第三方庫
  3. 要使用瀏覽器 要參考 url_launcher第三方庫

使用方法:

1.打開 pubspec.yaml 文件移斩,然后在dependencies下添加dio: 2.1.x (表示最新版)


  1. 終端運(yùn)行
flutter packages get
終端顯示完成

3.在main.dart中引入開始使用


main.dart

三.dio的使用

1. 自己準(zhǔn)備一個(gè)服務(wù)器接口 。(有接口的跳過不用自己搭建一個(gè)服務(wù)器了)

這里我是用swift語言自己在本機(jī)搭建一個(gè)PerfectSwift

不愿意研究的可以直接下面,有時(shí)間了寫一個(gè)完整的swift服務(wù)器的教程

注:【】中表示輸入的命令

bogon:~ home$ 【 mkdir  /Users/chaoshen/SwiftServer 】
bogon:~ home$ 【 cd   /Users/chaoshen/SwiftServer 】
bogon:SwiftServer home$ 【 git clone https://github.com/PerfectlySoft/PerfectTemplate.git】
Cloning into 'PerfectTemplate'...
remote: Enumerating objects: 275, done.
remote: Total 275 (delta 0), reused 0 (delta 0), pack-reused 275
Receiving objects: 100% (275/275), 60.50 KiB | 160.00 KiB/s, done.
Resolving deltas: 100% (137/137), done.
bogon:SwiftServer home$ 【 cd PerfectTemplate 】
bogon:PerfectTemplate home$ 【 swift build】
省略編譯信息
bogon:PerfectTemplate home$【 .build/debug/PerfectTemplate】
[INFO] Starting HTTP server localhost on :::8181#表示啟動了

成功之后瀏覽器輸入http://127.0.0.1:8181/
有界面出現(xiàn)就是成功了向瓷。 PerfectTemplate/main.swift 更改文件可以更改接口

終端【ctrl + c】 停止運(yùn)行
進(jìn)入目錄查看一下

如果你是用xcode開發(fā) 肠套,隨意位置建立一個(gè)文件夾 【cd】/終端【swift package generate-xcodeproj
】,建立一個(gè)server服務(wù)器項(xiàng)目一直使用xcode寫就可以了猖任。
vccode 寫app xcode寫服務(wù)器是不是不要太爽啊????????

holle world是個(gè)頁面web接口 你稚。業(yè)務(wù)接口返回json那種怎么寫 。
將下面代碼覆蓋main.swift,重新啟動服務(wù)器接口就可以請求了朱躺。

如果你不了解服務(wù)器編寫/ 現(xiàn)在還不建議你用xcode編寫刁赖,因?yàn)闀写罂樱看卧黾游募蛘邉h除文件都要重新編譯长搀,【打包】Xcode工程

2. 刪除test文件夾 以及里面的文件 乾闰,刪除 main.dart的所有內(nèi)容 ,寫一個(gè)簡單的例子運(yùn)行一下
2.1get接口獲取
import 'package:dio/dio.dart';

void main() => getHttp(); ##主函數(shù)入口 

void getHttp() async {  ## 異步處理
  try {   ##不崩潰處理 
    Response response = await 
    Dio().get("http://192.168.1.107:8181/getDatas");
    print("我很帥" + response.toString());
  } catch (e) {
    print("我不帥" + e.toString());
  }
}
2.2post接口獲取
import 'package:dio/dio.dart';

void main() => getHttp(); ##主函數(shù)入口 

void getHttp() async {  ## 異步處理
  try {   ##不崩潰處理 
    Response response = await 
    Dio().post("http://192.168.1.107:8181/getDatas",data:{"id":12,"name":"wendu"});
    print("我很帥" + response.toString());
  } catch (e) {
    print("我不帥" + e.toString());
  }
}
2.3 多個(gè)接口

future 參見文章

response= await Future.wait([dio.post("/mobile"),dio.get("/token")]);
2.4 下載文件

我們下載一張圖片試試

import 'dart:async';
import 'dart:io';
import 'package:dio/dio.dart';

// In this example we download a image and listen the downloading progress.
main() async {
  var dio = new Dio();
  dio.interceptors.add(LogInterceptor());
  // This is big file(about 200M)
//   var url = "http://download.dcloud.net.cn/HBuilder.9.0.2.macosx_64.dmg";

  var url =
      "https://cdn.jsdelivr.net/gh/flutterchina/flutter-in-action@1.0/docs/imgs/book.jpg";

 // var url = "https://www.baidu.com/img/bdlogo.gif";
 // await download1(dio, url, "./example/book1.jpg");
  await download1(dio, url, (HttpHeaders headers)=>"./example/book1.jpg");
  //await download2(dio, url, "./example/book2.jpg");
}

Future download1(Dio dio, String url, savePath) async {
  try {
    await dio.download(
      url,
      savePath,
      onReceiveProgress: showDownloadProgress,
    );
  } catch (e) {
    print(e);
  }
}

Future download2(Dio dio, String url, String savePath) async {
  try {
    Response response = await dio.get(
      url,
      onReceiveProgress: showDownloadProgress,
      //Received data with List<int>
      options: Options(
        responseType: ResponseType.bytes,
        followRedirects: false,
      ),
    );
    print(response.headers);
    File file = new File(savePath);
    var raf = file.openSync(mode: FileMode.write);
    // response.data is List<int> type
    raf.writeFromSync(response.data);
    await raf.close();
  } catch (e) {
    print(e);
  }
}

void showDownloadProgress(received, total) {
  if (total != -1) {
    print((received / total * 100).toStringAsFixed(0) + "%");
  }
}
2.5 后面都嘗試一下可以干什么

四. json字符串的反序列化

1.中文官網(wǎng)介紹

注意:

使用 dart:convert ,flutter 禁止運(yùn)行時(shí)反射

  1. 單個(gè)無依賴的model 可以使用 JSON.decode()
class User {
  final String name;
  final String email;

  User(this.name, this.email);

  User.fromJson(Map<String, dynamic> json)
      : name = json['name'],
        email = json['email'];

  Map<String, dynamic> toJson() =>
    {
      'name': name,
      'email': email,
    };
}

調(diào)用

Map userMap = JSON.decode(json);
var user = new User.fromJson(userMap);

print('Howdy, ${user.name}!');
print('We sent the verification link to ${user.email}.');
  • 一個(gè)User.fromJson 構(gòu)造函數(shù), 用于從一個(gè)map構(gòu)造出一個(gè) User實(shí)例 map structure
  • 一個(gè)toJson 方法, 將 User 實(shí)例轉(zhuǎn)化為一個(gè)map.
2. 在大中型項(xiàng)目中使用代碼生成, 例如盈滴,json_serializablebuilt_value這樣的庫。

我們以 json_serializable 為例子來研究轿钠,引入包
json_serializable package

2.1 引入
需要在pubspec.yaml添加三個(gè)依賴巢钓,它們分別是:"son_annotation" "build_runner" 和 "json_serializable"。

dependencies:
  # Your other regular dependencies here
  json_annotation: '>=2.1.0 <2.3.0'  # json反序列化json_serializable需要

dev_dependencies:
  # Your other dev_dependencies here
  build_runner: ^1.0.0  # #創(chuàng)建.g.dart   json反序列化json_serializable需要
  json_serializable: '2.1.0 <2.3.0'  # json反序列化json_serializable需要

注意yaml文件的縮進(jìn)要求很嚴(yán)格疗垛,與python類似

2.2 環(huán)境配置
根目錄運(yùn)行

flutter packages pub run build_runner build #利用build_runner設(shè)置環(huán)境依賴
flutter packages pub run build_runner watch #當(dāng)創(chuàng)建模型文件時(shí)自動創(chuàng)建 “.g.dart”文件

注意:watch 命令不取消會一直運(yùn)行症汹,只要創(chuàng)建就會生成一個(gè).g.dart 文件 ,ctrl + C 終端取消。 也可以每次都build 重新生成 贷腕。 需要重新生成的可以刪除.g.dart文件背镇,重新build 命令。

2.3 創(chuàng)建模型文件
Person.dart文件

/**Person model class */

import 'package:json_annotation/json_annotation.dart';

part 'Person.g.dart';
///標(biāo)志class需要實(shí)現(xiàn)json序列化功能
@JsonSerializable()
///里面有兩個(gè)屬性 name和id
class Person extends Object {
  String name;
  int id;

///通過JsonKey重新定義參數(shù)名
  @JsonKey(name: "details_id")
  int detailsId;

  /// 構(gòu)造函數(shù)
  Person(this.name, this.id, this.detailsId);

/// _$HomeModelFromJson 這個(gè)函數(shù)在.g.dart中泽裳,命名就是類名+FromJson
/// 直接寫就行 報(bào)錯(cuò)也沒關(guān)系 生成.g.dart文件之后就好了
  factory Person.fromJson(Map<String, dynamic> json) => _$PersonFromJson(json);
}

五.錯(cuò)誤處理

1.出現(xiàn)錯(cuò)誤信息: Program ended with exit code: 0

解決方法 :

sudo lsof -i -P | grep -i "listen"   # 查看所有監(jiān)聽信息  瞒斩,找到占用端口的  【pid】 ,會卡一會查詢中 涮总,進(jìn)程名字是PerfectTe

kill 【pid】 # pid 是上命令中查到的進(jìn)程id

WARNING: CocoaPods requires your terminal to be using UTF-8 encoding.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胸囱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瀑梗,更是在濱河造成了極大的恐慌烹笔,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抛丽,死亡現(xiàn)場離奇詭異谤职,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)亿鲜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門允蜈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事陷寝」埽” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵凤跑,是天一觀的道長爆安。 經(jīng)常有香客問我,道長仔引,這世上最難降的妖魔是什么扔仓? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮咖耘,結(jié)果婚禮上翘簇,老公的妹妹穿的比我還像新娘。我一直安慰自己儿倒,他們只是感情好版保,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著夫否,像睡著了一般彻犁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凰慈,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天汞幢,我揣著相機(jī)與錄音,去河邊找鬼微谓。 笑死森篷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的豺型。 我是一名探鬼主播仲智,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼姻氨!你這毒婦竟也來了坎藐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤哼绑,失蹤者是張志新(化名)和其女友劉穎岩馍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抖韩,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛀恩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茂浮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片双谆。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壳咕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出顽馋,到底是詐尸還是另有隱情谓厘,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布寸谜,位于F島的核電站竟稳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏熊痴。R本人自食惡果不足惜他爸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望果善。 院中可真熱鬧诊笤,春花似錦、人聲如沸巾陕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鄙煤。三九已至许赃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間馆类,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工弹谁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乾巧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓预愤,卻偏偏與公主長得像沟于,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子植康,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

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