Flutter网络请求插件flutter_network的使用

Flutter网络请求插件flutter_network的使用

该插件为您的Flutter应用程序提供了网络功能。它包括了执行各种类型HTTP请求和处理API响应的功能。模块组织在几个文件中:

如何使用

  1. 在Dart文件中导入网络模块:
import 'package:flutter_network/flutter_network.dart';
  1. 创建一个FlutterNetwork实例以进行HTTP请求:
// 初始化一个FlutterNetwork实例,并设置基础URL和令牌回调函数
FlutterNetwork flutterNetwork = FlutterNetwork(
  baseUrl: 'https://api.example.com',
  tokenCallBack: () {
   return Future.value();
 },
);
  1. 使用flutterNetwork实例进行HTTP请求:
// 发送GET请求到指定端点,并包含查询参数
Response<dynamic> response = await flutterNetwork.get(
  '/endpoint',
  apiType: APIType.protected,
  data: {'requestBody': requestBody},  
  query: {'param': 'value'},
);

功能

  1. Flutter Network

    • 支持如GETPOSTPUTPATCHDELETE等HTTP方法。
    • 提供多种可定制选项,如头部信息、超时时间等。
  2. 错误处理

    • Failure类表示服务器返回的不同类型的失败响应。
    • 具体类如BadRequestUnauthorized等扩展自Failure类。
  3. 缓存

    • 使用dio_cache_interceptor提供内置缓存功能。

    • CacheOptions: 若要为HTTP请求启用缓存,在初始化FlutterNetwork时包含CacheOptions。例如:

      final FlutterNetwork flutterNetwork = FlutterNetwork(
        baseUrl: "https://api.example.com",
        cacheOptions: CacheOptions(
          store: MemCacheStore(maxSize: 10485760, maxEntrySize: 1048576),
          policy: CachePolicy.forceCache,
          maxStale: const Duration(days: 10),
          priority: CachePriority.high,
        ),
      );
      

      可根据具体需求自定义CacheOptions

    • 轻松添加重试功能,通过在初始化FlutterNetwork时包含RetryInterceptor。例如:

      final FlutterNetwork flutterNetwork = FlutterNetwork(
        baseUrl: "https://api.example.com",
        retryInterceptor: RetryInterceptor(
          dio: dio, // 指定您的Dio实例
          logPrint: print, // 指定日志函数(可选)
          retries: 3, // 重试次数(可选)
          retryDelays: const [
            Duration(seconds: 1), // 第一次重试前等待1秒
            Duration(seconds: 2), // 第二次重试前等待2秒
            Duration(seconds: 3), // 第三次重试前等待3秒
          ],
        ),
      );
      

      自定义RetryInterceptor参数来定义您的首选重试策略,包括重试次数和重试之间的延迟。

  4. 基于令牌的身份验证

    • 通过tokenCallBack函数轻松集成身份验证令牌。
    • FlutterNetwork实例自动处理受保护API调用的身份验证令牌,无需多次初始化传递。
  5. 依赖管理

    • 使用流行的包如diodio_smart_retrydio_cache_interceptorpretty_dio_logger
  6. 可定制性

    • 可以轻松定制以满足应用的具体需求。

依赖项

  • dio: 5.3.4
  • dio_smart_retry: 6.0.0
  • dio_cache_interceptor: 3.5.0
  • pretty_dio_logger: 1.3.1

可以根据具体需求定制网络模块。祝您网络编程愉快!


示例代码

import 'package:flutter/material.dart';
import 'package:flutter_network/flutter_network.dart';
import 'package:network_example/post_model.dart';

const String baseUrl = 'https://jsonplaceholder.typicode.com';
const String posts = '/posts';

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

class MyApp extends StatelessWidget {
  MyApp({super.key});

  /// [FlutterNetwork] 是一个用于处理Flutter应用程序中网络请求的工具类。
  ///
  /// 它通过封装常见的网络功能并允许自定义基础URL,提供了一种方便的方法来进行HTTP请求。
  final FlutterNetwork flutterNetwork = FlutterNetwork(
    baseUrl: baseUrl,
  );

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '网络包示例',
      home: NetworkExample(flutterNetwork: flutterNetwork),
    );
  }
}

class NetworkExample extends StatelessWidget {
  const NetworkExample({
    Key? key,
    required this.flutterNetwork,
  }) : super(key: key);

  final FlutterNetwork flutterNetwork;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('网络包'),
        centerTitle: true,
      ),
      body: FutureBuilder<List<PostModel>>(
        future: fetchPosts(),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return const Center(
              child: CircularProgressIndicator(),
            );
          } else if (snapshot.hasError) {
            return Center(
              child: Text('错误: ${snapshot.error}'),
            );
          } else if (!snapshot.hasData || snapshot.data!.isEmpty) {
            return const Center(
              child: Text('无数据可用'),
            );
          } else {
            return ListView.builder(
              itemCount: snapshot.data!.length,
              itemBuilder: (BuildContext context, int index) {
                return Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Card(
                    child: ListTile(
                      title: Text(
                        snapshot.data![index].title,
                      ),
                      subtitle: Text(
                        snapshot.data![index].body,
                      ),
                    ),
                  ),
                );
              },
            );
          }
        },
      ),
    );
  }

  /// 从指定的API端点获取帖子列表。
  ///
  /// 参数:
  /// - [flutterNetwork]: 用于发送HTTP GET请求的[FlutterNetwork]实例。
  /// - [endpoint]: 指定特定的API端点。
  /// - [apiType]: [APIType]枚举定义要访问的API类型(公共或受保护)。
  /// - [query]: 可选参数,用于传递查询参数。
  ///
  /// 返回包含API数据的响应,如果请求失败,则抛出异常。
  Future<List<PostModel>> fetchPosts() async {
    try {
      final response = await flutterNetwork.get(
        posts,
        apiType: APIType.public,
        query: {
          '_page': 1,
          '_limit': 10,
        },
      );
      List<dynamic> body = response.data;
      return body.map((dynamic item) => PostModel.fromJson(item)).toList();
    } catch (e, stackTrace) {
      debugPrint(e.toString());
      debugPrint(stackTrace.toString());
      throw Exception('加载帖子失败');
    }
  }
}

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

1 回复

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


flutter_network 是一个用于简化 Flutter 应用程序中网络请求的插件。虽然 Flutter 官方推荐使用 http 或者 dio 库来处理网络请求,但如果你正在使用或想要尝试 flutter_network 插件,以下是基本的使用指南。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 flutter_network 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_network: ^版本号

请将 ^版本号 替换为最新的版本号。

2. 导入包

在你的 Dart 文件中导入 flutter_network 包:

import 'package:flutter_network/flutter_network.dart';

3. 初始化网络服务

在使用 flutter_network 之前,你需要初始化网络服务:

void main() {
  Network().init(baseUrl: "https://jsonplaceholder.typicode.com");
  runApp(MyApp());
}

4. 发送 GET 请求

你可以使用 Network() 实例来发送 GET 请求:

Future<void> fetchData() async {
  try {
    var response = await Network().get('/posts');
    print(response.data);
  } catch (e) {
    print('Error: $e');
  }
}

5. 发送 POST 请求

发送 POST 请求也非常简单:

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

6. 处理响应

Network()getpost 方法返回一个 Response 对象,你可以通过 response.data 访问返回的数据。

7. 错误处理

你可以使用 try-catch 块来捕获和处理网络请求中的错误。

8. 设置请求头

你可以在发起请求时设置请求头:

var response = await Network().get('/posts', headers: {
  'Authorization': 'Bearer your_token',
});

9. 其他 HTTP 方法

flutter_network 也支持其他 HTTP 方法,如 put, delete, patch 等:

var response = await Network().put('/posts/1', data: {
  'title': 'Updated Title',
});

var response = await Network().delete('/posts/1');

10. 配置全局设置

你可以在 init 方法中配置全局设置,如超时时间、默认请求头等:

Network().init(
  baseUrl: "https://jsonplaceholder.typicode.com",
  timeout: Duration(seconds: 10),
  headers: {
    'Authorization': 'Bearer your_token',
  },
);
回到顶部