Flutter网络请求管理插件pq_network的使用

pq_network概述

pq_network是一个基于 Dio 的网络请求管理插件,提供了许多实用功能,如快速设置代理、日志格式化、mock 数据支持以及 JSON 解码等。

pq_network使用示例

配置Dio

在进行任何网络请求之前,需要先配置 DioBaseOptions。以下是配置示例:

BaseOptions options = BaseOptions(
    connectTimeout: 20000,   // 连接超时时间
    receiveTimeout: 30000,   // 接收数据超时时间
    sendTimeout: 30000,      // 发送数据超时时间
    baseUrl: "https://example.com/api", // 基础URL
    headers: {'Content-Type': 'application/json'}); // 默认请求头
PQNetwork.config(options);

请求示例(Mock)

通过 mock 参数可以模拟网络请求,并返回自定义的数据。

_get() async {
  final path = "https://example.com/get";

  final res = await PQNetwork.get(
    path,
    mock: true,             // 启用mock模式
    mockData: {"msg": "OK", "data": {}, "code": 0}, // 自定义返回数据
  );

  print("xxxxxxxxxx get res $res"); // 输出模拟数据
}

请求示例(Mock + Decoder)

结合 decoder 参数,可以将返回的 JSON 数据自动解析为指定的模型类。

_getAndDecoder() async {
  final path = "https://example.com/get";

  final res = await PQNetwork.get(
    path,
    decoder: (data) => MockDataEntity.fromJson(data), // 自动解析为模型类
    mock: true,
    mockData: {"msg": "OK", "data": {}, "code": 0},
  );

  print("xxxxxxxxxx get res $res");
}

// 定义模型类
class MockDataEntity {
  String? msg;
  int? code;
  dynamic data;

  MockDataEntity({this.data, this.code, this.msg});

  MockDataEntity.fromJson(Map<String, dynamic> json) {
    msg = json['msg'];
    code = json['code'];
    data = json['data'];
  }
}

其他请求示例

POST 请求
_post() async {
  final res = await PQNetwork.post(
      "https://example.com/post",
      mock: true,            // 启用mock模式
      mockData: "aaaaaaaaaa"); // 自定义返回数据

  print("xxxxxxxxxx post res $res");
}
DELETE 请求
_delete() async {
  final res = await PQNetwork.delete(
      "https://example.com/delete",
      mock: true,
      mockData: "aaaaaaaaaa");

  print("xxxxxxxxxx delete res $res");
}
PUT 请求
_put() async {
  final res = await PQNetwork.put(
      "https://example.com/put",
      mock: true,
      mockData: "aaaaaaaaaa");

  print("xxxxxxxxxx put res $res");
}

文件下载

可以通过 PQNetwork.download 方法实现文件下载。

_download() async {
  Directory tempDir = await getTemporaryDirectory(); // 获取临时目录
  String savePath = tempDir.path + "/111.jpeg";       // 设置保存路径

  final res = await PQNetwork.download(
      "https://example.com/file.jpg", savePath); // 下载文件

  print("xxxxxxxxxxxxxxxx res $savePath");
}

获取二进制数据

通过 PQNetwork.getBytes 方法可以获取图片或其他二进制数据。

_getBytes() async {
  final res = await PQNetwork.getBytes(
      "https://example.com/image.jpg");

  setState(() {
    imageBytes = Uint8List.fromList(res.data ?? []); // 更新状态
  });
}

完整示例代码

以下是一个完整的示例代码,展示了如何使用 pq_network 插件进行各种网络请求。

import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:pq_network/pq_network.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Uint8List imageBytes = Uint8List(0);

  [@override](/user/override)
  void initState() {
    super.initState();
    BaseOptions options = BaseOptions(
        connectTimeout: 20000,
        receiveTimeout: 30000,
        sendTimeout: 30000,
        headers: {'Content-Type': 'application/json'});
    PQNetwork.config(options);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('PQ Network Example')),
      body: Column(
        children: [
          CupertinoButton(child: Text("GET"), onPressed: _get),
          CupertinoButton(child: Text("GET AND DECODER"), onPressed: _getAndDecoder),
          CupertinoButton(child: Text("POST"), onPressed: _post),
          CupertinoButton(child: Text("DELETE"), onPressed: _delete),
          CupertinoButton(child: Text("PUT"), onPressed: _put),
          CupertinoButton(child: Text("DOWNLOAD"), onPressed: _download),
          CupertinoButton(child: Text("GET_BYTES"), onPressed: _getBytes),
          Row(
            children: [
              Text("BytesImage ${imageBytes.isNotEmpty}"),
              if (imageBytes.isNotEmpty)
                Image.memory(
                  imageBytes,
                  width: 30,
                  height: 30,
                )
            ],
          )
        ],
      ),
    );
  }

  _get() async {
    final path = "https://example.com/get";

    final res = await PQNetwork.get(
      path,
      mock: true,
      mockData: {"msg": "OK", "data": {}, "code": 0},
    );

    print("xxxxxxxxxx get res $res");
  }

  _getAndDecoder() async {
    final path = "https://example.com/get";

    final res = await PQNetwork.get(
      path,
      decoder: (data) => MockDataEntity.fromJson(data),
      mock: true,
      mockData: {"msg": "OK", "data": {}, "code": 0},
    );

    print("xxxxxxxxxx get res $res");
  }

  _post() async {
    final res = await PQNetwork.post(
        "https://example.com/post",
        mock: true,
        mockData: "aaaaaaaaaa");

    print("xxxxxxxxxx post res $res");
  }

  _delete() async {
    final res = await PQNetwork.delete(
        "https://example.com/delete",
        mock: true,
        mockData: "aaaaaaaaaa");

    print("xxxxxxxxxx delete res $res");
  }

  _put() async {
    final res = await PQNetwork.put(
        "https://example.com/put",
        mock: true,
        mockData: "aaaaaaaaaa");

    print("xxxxxxxxxx put res $res");
  }

  _download() async {
    Directory tempDir = await getTemporaryDirectory();
    String savePath = tempDir.path + "/111.jpeg";

    final res = await PQNetwork.download(
        "https://example.com/file.jpg", savePath);

    print("xxxxxxxxxxxxxxxx res $savePath");
  }

  _getBytes() async {
    final res = await PQNetwork.getBytes(
        "https://example.com/image.jpg");

    setState(() {
      imageBytes = Uint8List.fromList(res.data ?? []);
    });
  }
}

class MockDataEntity {
  String? msg;
  int? code;
  dynamic data;

  MockDataEntity({this.data, this.code, this.msg});

  MockDataEntity.fromJson(Map<String, dynamic> json) {
    msg = json['msg'];
    code = json['code'];
    data = json['data'];
  }
}

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

1 回复

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


pq_network 是一个用于 Flutter 的网络请求管理插件,它简化了网络请求的处理,并提供了诸如请求拦截、错误处理、缓存管理等功能。以下是如何使用 pq_network 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  pq_network: ^1.0.0  # 请使用最新版本

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

2. 初始化 PQNetwork

在你的 Flutter 应用中初始化 PQNetwork。通常可以在 main.dart 中进行初始化:

import 'package:flutter/material.dart';
import 'package:pq_network/pq_network.dart';

void main() {
  runApp(MyApp());

  // 初始化 PQNetwork
  PQNetwork.init(
    baseUrl: 'https://jsonplaceholder.typicode.com', // 你的 API 基础 URL
    interceptors: [
      // 添加拦截器
      LoggingInterceptor(),
    ],
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

3. 发起网络请求

你可以使用 PQNetwork 来发起 GET、POST、PUT、DELETE 等请求。以下是一个简单的 GET 请求示例:

import 'package:flutter/material.dart';
import 'package:pq_network/pq_network.dart';

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _responseData = '';

  Future<void> _fetchData() async {
    try {
      final response = await PQNetwork.get('/posts/1');
      setState(() {
        _responseData = response.data.toString();
      });
    } catch (e) {
      setState(() {
        _responseData = 'Error: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('PQ Network Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(_responseData),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _fetchData,
              child: Text('Fetch Data'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 使用拦截器

pq_network 支持拦截器,你可以在请求发送前或响应返回后进行一些处理。例如,添加一个日志拦截器:

class LoggingInterceptor extends Interceptor {
  @override
  void onRequest(RequestOptions options) {
    print('Request: ${options.method} ${options.path}');
    super.onRequest(options);
  }

  @override
  void onResponse(Response response) {
    print('Response: ${response.statusCode}');
    super.onResponse(response);
  }

  @override
  void onError(DioError err) {
    print('Error: ${err.message}');
    super.onError(err);
  }
}

5. 错误处理

pq_network 会自动处理一些常见的网络错误,但你也可以在 catch 块中自定义错误处理逻辑:

try {
  final response = await PQNetwork.get('/posts/1');
  setState(() {
    _responseData = response.data.toString();
  });
} catch (e) {
  setState(() {
    _responseData = 'Error: $e';
  });
}
回到顶部