Flutter网络请求插件flutter_dio_module的使用

Flutter网络请求插件flutter_dio_module的使用

基于Dio封装的网络请求,自带sqlite缓存,可设置缓存也可以不用缓存,使用builder模式网络请求,简单易用,实现了抽象解析json,对返回数据进行二次包装,可以对包装进行处理或者拦截修改。支持切换host,支持拦截器自定义,默认自带网络日志打印。默认支持Stream模式。

版本已经发布

欢迎大家关注并提出问题,

  flutter_dio_module: ^1.2.5

项目目录结构

|-- lib
|   |-- com
|   |   |-- app,data
|   |   |   |-- Constants.dart
|   |   |   '-- wanbean_entity.dart
|   |   '-- flutter
|   |       '-- http
|   |           |-- NetworkManager.dart
|   |           |-- RxDio.dart
|   |           |-- RxDioConfig.dart
|   |           |-- adapter
|   |           |   |-- CallBack.dart
|   |           |   |-- Method.dart
|   |           |   '-- ResponseDates.dart
|   |           |-- bean
|   |           |   '-- BaseBean.dart
|   |           |-- cacheUtils
|   |           |   '-- CacheInterceptor.dart
|   |           |   '-- CacheInterceptorInterface.dart
|   |           |   '-- CacheInterfaces.dart
|   |           |   '-- CacheSQLImpl.dart
|   |           |-- interceptorss
|   |           |   '-- HttpLogInterceptor.dart
|   |           |-- interface
|   |           |   '-- BaseApplication.dart
|   |           '-- utils
|   |               |-- DatabaseSql.dart
|   |               '-- MD5Utils.dart

lib 项目仓库总包
app,data 数据以及常量配置表
http 为插件源码仓库

联系我

项目地址可以在项目里面咨询提问题,也可以提交优化,
邮箱 xj626361950@163.com

Json解析

解析方式有别于Android解析,对序列化和反序列化进行解析.

  1. 解析JSON and serialization 这种方式处理起来比较麻烦需要手动敲字段获取数据.
  2. 可以通过三方网站实现bean类的实现 documentation

使用方法

//在项目中初始化实现改接口
abstract class IJsonConvert {
  M? fromJsonAsT<M>(dynamic json);
}

class jsonbase extends IJsonConvert {
  [@override](/user/override)
  M? fromJsonAsT<M>(json) {
    ///这里JsonConvert对象为当前工作空间的
    return JsonConvert().fromJsonAsT(json);
  }
}

/*先将字符串转成json*/
Map<String, dynamic> json = jsonDecode(jsonData);
/*将Json转成实体类*/
NewsBean newsBean=NewsBean.fromJson(news);
/*取值*/
String sats = newsBean.result.stat;
  1. 比较方便一点AS导入插件FlutterJsonBeanFactory通过插件直接去生成对应bean不需要手动更改推荐此方案。

使用方法 插件导入之后,json数据放入插件点击保存就可以了. 详细说明

网络请求使用方法

RxDio初始化

创建一个future来初始化项目中所需要的东西,

GlobalConfig 中可以设置请求的host,是否打印日志,是否使用缓存,设置拦截器

class Global {
  static Future init() async {
    return GlobalConfig.intstance
      ..setDebugConfig(true)
      ..setHost("https://wanandroid.com/")
      ..setUserCacheConfig(true)
      ..setJsonConvert(jsonConvert); //次参数为必选项,用于解析使用,JsonConvert()需要继承IJsonConvert
  }
}

void main() => Global.init().then((e) => runApp(MyApp()));

设置JsonConvert()类

找到目录 package:workspac/generated/json/base/json_convert.content.dart 继承 IJsonConvert

如果找不到 json_convert.content.dart 使用FlutterJsonBeanFactory插件导入一下即可

class JsonConvert extends IJsonConvert {
  T? convert<T>(dynamic value) {
    if (value == null) {
      return null;
    }
    return asT<T>(value);
  }
}

RxDio模式解析

Stream<ResponseDatas<WanbeanEntity>> test() {
  var aaa = RxDio.instance;
  aaa.setUrl(Constants.config);
  aaa.setHost("www.baidu.com"); //设置域名
  aaa.setCacheMode(CacheMode.DEFAULT);
  aaa.setRequestMethod(Method.Get);
  aaa.setTransFrom<WanbeanEntity>((p0) {
    var a = p0 as WanbeanEntity;
    print("=======setTransFrom>" + a.datas.first.content);
    return p0;
  });
  return aaa.asStreams<WanbeanEntity>();
}

///设置刷新
setState(() {
  test();
});

///页面结束的时候取消请求
[@override](/user/override)
void dispose() {
  RxDio.instance.cancelAll();
  super.dispose();
}

Column(
  mainAxisAlignment: MainAxisAlignment.center,
  children: <Widget>[
    Text(
      'You have pushed the button this many times:$_counter',
    ),
    StreamBuilder<ResponseDatas<WanbeanEntity>>(
      builder: ((context, snapshot) {
        return Text(
          '${snapshot.data?.data?.size}',
          style: Theme.of(context).textTheme.headline4,
        );
      }),
      stream: test(),
    ),
  ],
)

更多关于Flutter网络请求插件flutter_dio_module的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络请求插件flutter_dio_module的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_dio_module 是一个基于 Dio 的网络请求插件,适用于 Flutter 应用。Dio 是 Dart 语言中一个强大的 HTTP 客户端,支持拦截器、全局配置、表单数据、文件上传等功能。

以下是如何在 Flutter 项目中使用 flutter_dio_module 进行网络请求的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 flutter_dio_module 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_dio_module: ^latest_version

然后运行 flutter pub get 以安装依赖。

2. 初始化 Dio 实例

在你的代码中,首先需要初始化一个 Dio 实例。你可以选择在全局范围内初始化,或者在具体的类中初始化。

import 'package:flutter_dio_module/flutter_dio_module.dart';

final dio = Dio();

你可以为 Dio 实例配置一些全局选项,比如 baseUrl、超时时间等。

dio.options.baseUrl = 'https://jsonplaceholder.typicode.com';
dio.options.connectTimeout = 5000; // 5 seconds
dio.options.receiveTimeout = 3000; // 3 seconds

3. 发起网络请求

使用 Dio 实例发起网络请求。常见的请求类型包括 GETPOSTPUTDELETE 等。

GET 请求

Future<void> fetchData() async {
  try {
    Response response = await dio.get('/posts/1');
    print(response.data);
  } catch (e) {
    print(e);
  }
}

POST 请求

Future<void> postData() async {
  try {
    Response response = await dio.post('/posts', data: {
      'title': 'foo',
      'body': 'bar',
      'userId': 1,
    });
    print(response.data);
  } catch (e) {
    print(e);
  }
}

4. 使用拦截器

Dio 提供了拦截器功能,你可以在请求发送前或响应接收前进行一些处理。

dio.interceptors.add(InterceptorsWrapper(
  onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
    // 在请求发送前做一些处理
    print('Request: ${options.uri}');
    return handler.next(options);
  },
  onResponse: (Response response, ResponseInterceptorHandler handler) {
    // 在响应接收前做一些处理
    print('Response: ${response.data}');
    return handler.next(response);
  },
  onError: (DioError e, ErrorInterceptorHandler handler) {
    // 在请求出错时做一些处理
    print('Error: ${e.message}');
    return handler.next(e);
  },
));

5. 文件上传

Dio 也支持文件上传。

Future<void> uploadFile() async {
  FormData formData = FormData.fromMap({
    'file': await MultipartFile.fromFile('path/to/file.txt', filename: 'upload.txt'),
  });

  try {
    Response response = await dio.post('/upload', data: formData);
    print(response.data);
  } catch (e) {
    print(e);
  }
}
回到顶部