详解Flutter网络请求Dio库的使用及封装


Posted in Java/Android onApril 14, 2022

Dart语言内置的HttpClient实现了基本的网络请求相关的操作。但HttpClient本身功能较弱,很多网络请求常用功能都不支持,因此在实际项目中,我们更多是使用dio库实现网络请求。

注:Flutter官网同样推荐在项目中使用Dio库。

Dio文档地址: pub.dev地址:dio | Dart Package

一、项目目录结构

详解Flutter网络请求Dio库的使用及封装

文件夹 功能
components 放置全局共用组件
router 全局路由管理
service 管理接口请求并对返回数据进行处理,复杂功能逻辑处理
store provider全局状态管理
utile 工具类,例如:接口请求工具类,数据持久化工具类,加密解密工具类……
views 界面管理,实现界面UI绘制的代码逻辑

二、封装思路:

1、在DioRequest工具类中统一初始化网络请求常见配置,实现请求拦截器、响应拦截器以及错误处理。

2、统一在service中管理接口请求,并且对返回的数据根据实际需求进行处理,如果数据的修改需要更新UI或者需要全局共享该数据,可以结合provider实现。

三、添加依赖

在pubspec.yaml文件中添加所需要的第三方依赖库

dev_dependencies:
  flutter_test:
    sdk: flutter 
  # The "flutter_lints" package below contains a set of recommended lints to
  # encourage good coding practices. The lint set provided by the package is
  # activated in the `analysis_options.yaml` file located at the root of your
  # package. See that file for information about deactivating specific lint
  # rules and activating additional ones.
  flutter_lints: ^1.0.0
  # 数据请求
  dio: ^4.0.4

四、简单实现网络请求

utils目录中新建dio_request.dart文件实现DioRequest网络请求的工具类。

import 'package:dio/dio.dart';
/// dio网络请求配置表 自定义
class DioConfig {
  static const baseURL = 'http://117.34.71.31:8081/paas-admin'; //域名
  static const timeout = 10000; //超时时间
} 
// 网络请求工具类
class DioRequest {
  late Dio dio;
  static DioRequest? _instance;
  /// 构造函数
  DioRequest() {
    dio = Dio();
    dio.options = BaseOptions(
        baseUrl: DioConfig.baseURL,
        connectTimeout: DioConfig.timeout,
        sendTimeout: DioConfig.timeout,
        receiveTimeout: DioConfig.timeout,
        contentType: 'application/json; charset=utf-8',
        headers: {});
    /// 请求拦截器 and 响应拦截机 and 错误处理
    dio.interceptors.add(InterceptorsWrapper(onRequest: (options, handler) {
      print("\n================== 请求数据 ==========================");
      print("url = ${options.uri.toString()}");
      print("headers = ${options.headers}");
      print("params = ${options.data}");
      return handler.next(options);
    }, onResponse: (response, handler) {
      print("\n================== 响应数据 ==========================");
      print("code = ${response.statusCode}");
      print("data = ${response.data}");
      print("\n");
      handler.next(response);
    }, onError: (DioError e, handler) {
      print("\n================== 错误响应数据 ======================");
      print("type = ${e.type}");
      print("message = ${e.message}");
      print("\n");
      return handler.next(e);
    }));
  }
  static DioRequest getInstance() {
    return _instance ??= DioRequest();
  }
}

五、实现登录注册服务

lib下新建service目录,并在service目录中新建login.dart文件。

import 'dart:convert';

import 'package:cyber_security/utils/http.dart';

class LoginService {
  /// 获取用户数据中心列表
  static Future<List> getDataCenter() async {
    var response = await DioRequest.getInstance().dio.get('/getDataCenter');
    var data = jsonDecode(response.toString());
    return data['dataCenterList'];
  }

  /// 登录接口
  static login(value) async {
    var response = await DioRequest.getInstance()
        .dio
        .post('/sys/login', queryParameters: value);
    var data = jsonDecode(response.toString()); 
    /// 对返回的身份凭证全局持久化存储
    return data['key'];
  }

  /// 获取权限列表
  static menuNav() async {
    var response = await DioRequest.getInstance().dio.get('/sys/menu/nav');
    var data = jsonDecode(response.toString());
    return data['key'];
  }
}

六、使用service服务

@override
  void initState() {
    // TODO: implement initState
    super.initState();
    /// 请求用户数据中心数据
    LoginService.getDataCenter().then((value) {
      setState(() {
        _dataCenterList = value;
      });
    });
  }

到此这篇关于Flutter网络请求Dio库的使用及封装详解的文章就介绍到这了!

Java/Android 相关文章推荐
为什么在foreach循环中JAVA集合不能添加或删除元素
Jun 11 Java/Android
Java实现简易的分词器功能
Jun 15 Java/Android
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
Jun 26 Java/Android
Springboot集成阿里云OSS上传文件系统教程
Jun 28 Java/Android
Java数组与堆栈相关知识总结
Jun 29 Java/Android
Springboot使用Spring Data JPA实现数据库操作
Jun 30 Java/Android
浅谈resultMap的用法及关联结果集映射
Jun 30 Java/Android
MyBatis-Plus 批量插入数据的操作方法
Sep 25 Java/Android
springboot中rabbitmq实现消息可靠性机制详解
Sep 25 Java/Android
Java 获取Word中所有的插入和删除修订的方法
Apr 06 Java/Android
SpringBoot中获取profile的方法详解
Apr 08 Java/Android
Elasticsearch 配置详解
Apr 19 Java/Android
详细介绍Java中的CyclicBarrier
Apr 13 #Java/Android
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
Apr 13 #Java/Android
Java的Object类的九种方法
Apr 13 #Java/Android
Java 使用类型为Object的变量指向任意类型的对象
Apr 13 #Java/Android
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
Apr 13 #Java/Android
Spring Cloud Netflix 套件中的负载均衡组件 Ribbon
Apr 13 #Java/Android
Android开发之WECHAT微信小程序路由跳转的两种形式
Apr 12 #Java/Android
You might like
php统计文件大小,以GB、MB、KB、B输出
2011/05/29 PHP
php使用mkdir创建多级目录入门例子
2014/05/10 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
php简单实现查询数据库返回json数据
2015/04/16 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
Prototype Array对象 学习
2009/07/19 Javascript
JS 事件绑定函数代码
2010/04/28 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
location对象的属性和方法应用(解析URL)
2013/04/12 Javascript
jquery做的一个简单的屏幕锁定提示框
2014/03/26 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
用Move.js配合创建CSS3动画的入门指引
2015/07/22 Javascript
高性能JavaScript 重排与重绘(2)
2015/08/11 Javascript
jquery模拟实现鼠标指针停止运动事件
2016/01/12 Javascript
javascript对象的相关操作小结
2016/05/16 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
2016/12/08 Javascript
通过sails和阿里大于实现短信验证
2017/01/04 Javascript
mint-ui在vue中的使用示例
2018/04/05 Javascript
vue-cli2打包前和打包后的css前缀不一致的问题解决
2018/08/24 Javascript
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
Layui Table js 模拟选中checkbox的例子
2019/09/03 Javascript
vue-cli3.X快速创建项目的方法步骤
2019/11/14 Javascript
windows下Virtualenvwrapper安装教程
2017/12/13 Python
python实现控制COM口的示例
2019/07/03 Python
python用tkinter实现一个gui的翻译工具
2020/10/26 Python
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
物流管理专业大学生自荐信
2013/10/04 职场文书
护理专业学生的求职信范文
2013/12/11 职场文书
小学教学随笔感言
2014/02/26 职场文书
法制教育演讲稿
2014/09/10 职场文书
2016年记者节感言
2015/12/08 职场文书
使用canvas实现雪花飘动效果的示例代码
2021/03/30 HTML / CSS
python百行代码实现汉服圈图片爬取
2021/11/23 Python
SQL SERVER存储过程用法详解
2022/02/24 SQL Server
JAVA长虹键法之建造者Builder模式实现
2022/04/10 Java/Android
apache ftpserver搭建ftp服务器
2022/05/20 Servers