详解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 相关文章推荐
SpringBoot2 参数管理实践之入参出参与校验的方式
Jun 16 Java/Android
解决SpringCloud Feign传对象参数调用失败的问题
Jun 23 Java/Android
Spring Boot 实现敏感词及特殊字符过滤处理
Jun 29 Java/Android
分析JVM源码之Thread.interrupt系统级别线程打断
Jun 29 Java/Android
总结Java对象被序列化的两种方法
Jun 30 Java/Android
Java图书管理系统,课程设计必用(源码+文档)
Jun 30 Java/Android
Java 实现限流器处理Rest接口请求详解流程
Nov 02 Java/Android
Java基于Dijkstra算法实现校园导游程序
Mar 17 Java/Android
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
Apr 24 Java/Android
Jmerte 分布式压测及分布式压测配置
Apr 30 Java/Android
Android中View.post和Handler.post的关系
Jun 05 Java/Android
Spring Boot实现文件上传下载
Aug 14 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中常用数组处理方法实例分析
2008/08/30 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
2016/03/21 PHP
PHP表单验证内容是否为空的实现代码
2016/11/14 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
用Javascript实现UTF8编码转换成gb2312编码
2006/12/22 Javascript
jQuery+ajax实现顶一下,踩一下效果
2010/07/17 Javascript
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
2011/07/26 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
JavaScript实现获取dom中class的方法
2015/02/09 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
js中setTimeout的妙用--防止循环超时
2017/03/06 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
vue+element-ui动态生成多级表头的方法
2018/08/28 Javascript
解决vue热替换失效的根本原因
2018/09/19 Javascript
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
详解50行代码,Node爬虫练手项目
2019/04/22 Javascript
小程序云开发实现数据库异步操作同步化
2019/05/18 Javascript
vue项目中极验验证的使用代码示例
2019/12/03 Javascript
[01:18:35]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第一场 1月29日
2021/03/11 DOTA
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
Django关于admin的使用技巧和知识点
2020/02/10 Python
Python实现鼠标自动在屏幕上随机移动功能
2020/03/14 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
selenium+超级鹰实现模拟登录12306
2021/01/24 Python
Python+Appium实现自动化清理微信僵尸好友的方法
2021/02/04 Python
关于探究python中sys.argv时遇到的问题详解
2021/02/23 Python
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
2012/12/28 HTML / CSS
CSS3实现超慢速移动动画效果非常流畅无卡顿
2014/06/15 HTML / CSS
使用phonegap克隆和删除联系人的实现方法
2017/03/31 HTML / CSS
End Clothing美国站:英国男士潮牌商城
2018/04/20 全球购物
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
镇副书记专题民主生活会对照检查材料思想汇报
2014/10/02 职场文书
学校光盘行动倡议书
2015/04/28 职场文书