Flutter Dio源码分析(一)--Dio介绍
创新互联2013年至今,先为六盘水等服务建站,六盘水等地企业,进行企业商务咨询服务。为六盘水企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
Flutter Dio源码分析(二)--HttpClient、Http、Dio对比
Flutter Dio源码分析(三)--深度剖析
Flutter Dio源码分析(四)--封装
Flutter Dio源码分析(一)--Dio介绍视频教程
Flutter Dio源码分析(二)--HttpClient、Http、Dio对比视频教程
Flutter Dio源码分析(三)--深度剖析视频教程
Flutter Dio源码分析(四)--封装视频教程
github仓库地址
本文会手把手教你该怎么去封装一个类库,平时在我们的工作中都是拿着别人的造好的轮子在使用,这篇文章将带你怎么去自己造轮子,以后再碰到别的类库需要对其进行封装的时候提供一个的思路和方法。
在前面的文章中,我们对 Dio 的基本使用、请求库对比、源码分析,我们知道 Dio 的使用非常的简单,那为什么还需要进行封装呢?有两点如下:
当组件库方法发生重要改变需要迁移的时候如果有多处地方用到,那么需要对使用到的每个文件都进行修改,非常的繁琐而且很容易出问题。
当不需要 Dio 库的时候,我们可以随时方便切换到别的网络请求库,当然 Dio 目前内置支持使用第三方库的适配器。
因为一个应用程序基本都是统一的配置方式,所以我们可以针对 拦截器 、 转换器 、 缓存 、 统一处理错误 、 代理配置 、 证书校验 等多个配置进行统一管理。
因为我们的应用程序在每个页面中都会用到网络请求,那么如果我们每次请求的时候都去实例化一个 Dio ,无非是增加了系统不必要的开销,而使用单例模式对象一旦创建每次访问都是同一个对象,不需要再次实例化该类的对象。
这是通过静态变量的私有构造器来创建的单例模式
我们对 超时时间 、 响应时间 、 BaseUrl 进行统一设置
因为不管是 get() 还是 post() 请求, Dio 内部最终都会调用 request 方法,只是传入的 method 不一样,所以我们这里定义一个枚举类型在一个方法中进行处理
我们已经把 Restful API 风格简化成了一个方法,通过 DioMethod 来标明不同的请求方式。在我们平时开发的过程中,需要在请求前、响应前、错误时对某一些接口做特殊的处理,那我们就需要用到拦截器。 Dio 为我们提供了自定义拦截器功能,很容易轻松的实现对请求、响应、错误时进行拦截
我们发现虽然 Dio 框架已经封装了一个 DioError 类库,但如果需要对返回的错误进行统一弹窗处理或者路由跳转等就只能自定义了
在我们发送请求的时候会碰到几种情况,比如需要对非open开头的接口自动加上一些特定的参数,获取需要在请求头增加统一的 token
在我们请求接口前可以对响应数据进行一些基础的处理,比如对响应的结果进行自定义封装,还可以针对单独的 url 做特殊处理等。
我们看了转换器的介绍,发现和拦截器的功能差不多,那为什么还要存在转换器,有两点:
执行流程: 请求拦截器 请求转换器 发起请求 响应转换器 响应拦截器 最终结果 。
只会被用于 'PUT'、 'POST'、 'PATCH'方法,因为只有这些方法才可以携带请求体(request body)
会被用于所有请求方法的返回数据。
在开发过程中,客户端和服务器打交道的时候,往往会用一个 token 来做校验,因为每个公司处理刷新token的逻辑都不一样,我这里举一个简单的例子
为什么我们需要有取消请求的功能,如果当我们的页面在发送请求时,用户主动退出当前界面或者app应用程序退出的时候数据还没有响应,那我们就需要取消该网络请求,防止不必要的错误。
由 服务器生成 的 一小段文本信息 ,发送给浏览器,浏览器把 cookie 以kv形式保存到本地 某个目录下的文本文件内,下一次请求同一网站时会把该 cookie 发送给服务器。
cookie 的使用需要用到两个第三方组件 dio_cookie_manager 和 cookie_jar
因为在我们平时的开发过程中,会碰到一种情况,在进行网络请求时,我们希望能正常访问到上次的数据,对于用户的体验比较好,而不是展示一个空白的页面,该缓存主要是 《Flutter实战》网络接口缓存 提供参考。
我们在程序退出后内存缓存将会消失,所以我们用 shared_preferences 进行磁盘缓存数据。
在我们用flutter进行抓包的时候需要配置 Dio 代理。由 DefaultHttpClientAdapter 提供了一个 onHttpClientCreate 回调来设置底层 HttpClient 的代理。
用于验证正在访问的网站是否真实。提供安全性,因为证书和域名绑定,并且由根证书机构签名确认。
日志打印主要是帮助我们开发时进行辅助排错
(*注:以下仅个人配置过程参考,系统win7-64)
所需软件
vsCode,Android Studio, MuMu模拟器 (直连手机调试的话就不需要了)
配置过程
1、Flutter安装
安装时忘记截图,具体可参考链接 flutter中文网 相关教程+ 百度 ,现在网上教程很多,多踩点坑总会成功的。
2、MuMu模拟器调试时需进行相关配置
(*注:直连手机调试可忽略以下;执行以下操作需要在执行flutter doctor成功后,flutter run执行前)
(1)mumu模拟器端口监听,需要执行
(2)mumu模拟器调试flutter run可能会报错,可以改成,具体原因可直接百度“--enable-software-rendering”
3、如需调试ios端可尝试虚拟机+macOS+xCode
vmware+macOs可参考链接 VMware15安装MacOS系统 ,笔者按照该步骤已安装成功
前端的同学对 Promise 肯定都很熟悉,而 Future 便是 dart 中 Promise ,但方法名称和使用方式还是有些许的差异的。
下面我们尝试,利用 Future 封装出js中我们熟悉的 Promise 。
使用示例
Promise.all , Promise.race , Promise.resolve , Promise.reject
Promise.allSettled 方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例。只有等到所有这些参数实例都返回结果,不管是 fulfilled 还是 rejected ,包装实例才会结束。该方法由 ES2020 引入
Promise.any() 方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例。只要参数实例有一个变成 fulfilled 状态,包装实例就会变成 fulfilled 状态;如果所有参数实例都变成 rejected 状态,包装实例就会变成 rejected 状态。该方法目前是一个第三阶段的 提案 。
Promise.any() 跟 Promise.race() 方法很像,只有一点不同,就是不会因为某个 Promise 变成 rejected 状态而结束。
顺便把 延迟函数 也封装一下,毕竟毫秒延迟的使用频率是最高的。
因为我们使用Flutter跨平台技术开发App时,会有很多公用组件,因为Flutter中一切皆为Widget,widget也比较细粒度,所以我们需要进行封装,用于一个项目或者公司不同项目中去~
那么今天写写如何发布package或者插件到Pub.dev上,扯扯谈O(∩_∩)O哈哈~
《Flutter的拨云见日》系列文章如下:
1、Flutter中指定字体(全局或者局部,自有字库或第三方)
2、Flutter发布Package(Pub.dev或私有Pub仓库)
首先,我们知道flutter有四种工程模式:Flutter Application、Flutter Module、Flutter Plugin和Flutter Package。
我们这里就主要讲Package 纯Dart插件的发布吧,都差不多。
创建工程后,就可以编写你的公共组件,或者公用字体库呀啥的, 都行。
在更改下你的pubspec.yaml文件,修改下你的versionCode,项目名称,项目描述,作者等
如果上传失败试试????的命令:
在执行该命令时,可能会中途调到网页,要求你登录google账号,登录授权,到时候登录账号并授权就可以了。
因为我们直接使用flutter packages pub publish是发布到Pub.dev上,并不是发布到私有仓库,该怎么办呢?
其实呢,也很简单!像versionCode,项目名,等都和发布Pub.dev是一样的。没啥区别。
有两种方式:
就是这么简单o( @ )o
相信大家引用Pub.dev上的第三方库都会了哈,到处都是这里不讲了
在使用flutter pub get就可以拉到私有仓库项目了
以上就差不多聊了聊package发布和获取的事儿了,都很明了,大家可以试试,挺简单的。
PS: 写文不易,觉得没有浪费你时间,请给个点赞~ ????
Uniapp目前比较成熟,而且用的是Vue语法,学习成本比较低,而且行业里面用的也比较广泛,而Flutter的话,学习成本略高,因为要学习新的语言,还有就是目前生态不是特别完备,等他再发展发展吧。黑马程序员官网有成套免费视频哦,有什么不懂的可以直接过去学习。您的采纳是对我成长的鞭策
webview加载vue nom run serve 本地网页
JSBridge.dart
JsPreventModel 拦截的Model
vue brdige.js
App.vue里面的调用