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

发布于 1周前 作者 nodeper 来自 Flutter

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

pop_network 是一个基于Dio HTTP客户端的扩展库,旨在简化HTTP请求并帮助开发者高效地使用REST API。它支持使用 http_mock_adapter 库来模拟响应。

安装

在你的 pubspec.yaml 文件中添加 pop_network 包:

dependencies:
  pop_network: ^1.1.2

然后运行 pub get 来安装该包。

入门指南

简单使用

要开始使用 pop_network,创建一个 ApiManager 实例并配置你的基础URL。以下是一个简单的GET请求示例:

import 'package:pop_network/pop_network.dart';

final _apiManager = ApiManager(
  baseUrl: 'https://jsonplaceholder.typicode.com',
);

void getTodo() async {
  final response = await _apiManager.get('/todos/1');
  print(response);
}

模拟响应

你还可以使用 pop_network 来模拟响应,以便进行测试或开发。提供一个 loadMockAsset 函数并使用 MockReplyParams 来配置模拟响应:

final _apiManager = ApiManager(
  baseUrl: 'https://jsonplaceholder.typicode.com',
  loadMockAsset: rootBundle.loadString, // 默认为Flutter的根目录
);

await _apiManager.get(
  '/todos/1',
  mockReplyParams: MockReplyParams(
    mockPath: 'todo_example',
    delay: const Duration(seconds: 1),
    status: HttpStatusEnum.ok,
  ),
);

日志记录

pop_network 提供了内置的日志记录支持。你可以这样配置日志记录:

final _apiManager = ApiManager(
  baseUrl: 'https://jsonplaceholder.typicode.com',
  interceptors: [
    PopNetworkLogInterceptor(
      logPrint: (str) => developer.log(str.toString(), name: 'TODO_LOG'),
    ),
  ],
);

使用 PopCacheInterceptor 缓存请求

该包包括一个缓存机制,允许你将HTTP响应缓存指定的时间。此功能通过 PopCacheInterceptorICacheRequestData 类实现。

创建一个 MemoryCacheRequestData 实例,该类使用Map在内存中管理缓存,或者创建你自己的 ICacheRequestData 实现,并用它来创建 PopCacheInterceptor 实例:

final apiManager = ApiManager(
  baseUrl: 'https://jsonplaceholder.typicode.com',
  interceptors: [
    PopCacheInterceptor(MemoryCacheRequestData()),
  ],
);

在请求中使用缓存

要为特定请求启用缓存,你需要在请求中提供 cacheExpiresIn 参数。该参数指定了响应应缓存的时间。以下是一个使用缓存的GET请求示例:

final response = await apiManager.get(
  '/todos',
  cacheExpiresIn: Duration(minutes: 15), // 将响应缓存15分钟
);
print(response.data);

问题和贡献

如果你遇到任何问题或希望为这个库做出贡献,请访问 GitHub仓库

完整示例

以下是一个完整的示例,展示了如何在Flutter应用中使用 pop_network 进行网络请求、模拟响应、日志记录和缓存:

pubspec.yaml

name: pop_network_example
description: A new Flutter project.

publish_to: 'none' # Remove this line if you wish to publish to pub.dev

version: 1.0.0+1

environment:
  sdk: ">=2.17.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  pop_network: ^1.1.2

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^2.0.0

flutter:
  uses-material-design: true
  assets:
    - assets/

main.dart

import 'package:flutter/material.dart';
import 'package:pop_network/pop_network.dart';
import 'package:flutter/services.dart' show rootBundle;

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  final _apiManager = ApiManager(
    baseUrl: 'https://jsonplaceholder.typicode.com',
    interceptors: [
      PopNetworkLogInterceptor(
        logPrint: (str) => developer.log(str.toString(), name: 'TODO_LOG'),
      ),
      PopCacheInterceptor(MemoryCacheRequestData()),
    ],
    loadMockAsset: rootBundle.loadString, // 默认为Flutter的根目录
  );

  String _response = '';

  void _getTodo() async {
    try {
      final response = await _apiManager.get(
        '/todos/1',
        cacheExpiresIn: Duration(minutes: 15), // 将响应缓存15分钟
      );
      setState(() {
        _response = response.data.toString();
      });
    } catch (e) {
      setState(() {
        _response = 'Error: $e';
      });
    }
  }

  void _getMockedTodo() async {
    try {
      final response = await _apiManager.get(
        '/todos/1',
        mockReplyParams: MockReplyParams(
          mockPath: 'assets/todo_example.json',
          delay: const Duration(seconds: 1),
          status: HttpStatusEnum.ok,
        ),
      );
      setState(() {
        _response = response.data.toString();
      });
    } catch (e) {
      setState(() {
        _response = 'Error: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Pop Network Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _getTodo,
              child: Text('Get Todo (Real)'),
            ),
            ElevatedButton(
              onPressed: _getMockedTodo,
              child: Text('Get Todo (Mocked)'),
            ),
            SizedBox(height: 20),
            Text(_response),
          ],
        ),
      ),
    );
  }
}

assets/todo_example.json

{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

说明

  1. pubspec.yaml:添加 pop_network 依赖并声明资产文件。
  2. main.dart:创建一个简单的Flutter应用,使用 pop_network 进行网络请求、模拟响应、日志记录和缓存。
  3. assets/todo_example.json:模拟响应的数据文件。

通过以上步骤,你可以在Flutter应用中轻松地使用 pop_network 进行网络请求管理。


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

1 回复

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


当然,pop_network 是一个用于 Flutter 的网络请求管理插件,它提供了便捷的方法来处理网络请求和响应,以及错误处理等功能。以下是一个简单的示例,展示了如何使用 pop_network 插件进行网络请求。

首先,确保你已经在 pubspec.yaml 文件中添加了 pop_network 依赖:

dependencies:
  flutter:
    sdk: flutter
  pop_network: ^最新版本号  # 请替换为实际的最新版本号

然后,运行 flutter pub get 来获取依赖。

接下来,你可以在你的 Flutter 项目中使用 pop_network。以下是一个完整的示例代码:

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  String responseData = '';
  bool isLoading = false;
  bool hasError = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Network Request Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            if (isLoading)
              CircularProgressIndicator(),
            if (hasError)
              Text('Error occurred during network request.'),
            if (!isLoading && !hasError)
              Text(responseData),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                fetchData();
              },
              child: Text('Fetch Data'),
            ),
          ],
        ),
      ),
    );
  }

  void fetchData() async {
    setState(() {
      isLoading = true;
      hasError = false;
      responseData = '';
    });

    try {
      // 初始化 PopNetwork 实例
      final PopNetwork popNetwork = PopNetwork.getInstance();
      
      // 配置请求参数
      final Map<String, dynamic> params = {
        'key1': 'value1',
        'key2': 'value2',
      };

      // 发送 GET 请求
      final response = await popNetwork.getRequest(
        url: 'https://api.example.com/data',  // 替换为实际的 API URL
        params: params,
      );

      // 处理响应数据
      if (response.isSuccess) {
        setState(() {
          responseData = response.data.toString();
        });
      } else {
        throw Exception(response.error?.message ?? 'Unknown error');
      }
    } catch (e) {
      setState(() {
        hasError = true;
      });
      print('Error: $e');
    } finally {
      setState(() {
        isLoading = false;
      });
    }
  }
}

在这个示例中,我们创建了一个简单的 Flutter 应用,其中包含一个按钮用于触发网络请求。当点击按钮时,fetchData 方法会被调用,该方法使用 pop_network 插件发送一个 GET 请求到指定的 URL,并处理响应数据。

请注意,你需要将 url 替换为实际的 API 端点,并根据你的 API 需求调整请求参数。此外,pop_network 插件的具体用法和配置可能会根据版本的不同而有所变化,因此请参考插件的官方文档以获取最新和详细的信息。

回到顶部