Flutter网络增强功能插件network_plus的使用

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

Flutter网络增强功能插件network_plus的使用

简介

network_plus 是一个强大的 Flutter 网络包,基于 DIO 构建,旨在通过缓存、日志记录、令牌认证和本地数据存储管理等功能简化 API 开发。


功能

  • DIO Wrapper:简化 HTTP 请求和响应。
  • Caching:高效缓存 API 响应以提升性能并减少网络使用。
  • Logging:生成 cURL 命令方便调试,并使用 Log.dLog.i 记录网络请求。
  • Token Authentication:无缝管理访问令牌和刷新令牌。
  • Retry Policies:根据自定义策略自动重试失败的请求。
  • Base Models:利用抽象基类处理请求和响应。
  • Local Storage Management:管理应用程序特定的数据存储。

安装

pubspec.yaml 文件中添加以下依赖项:

dependencies:
  network_plus: ^1.0.0

执行 flutter pub get 安装依赖。


入门指南

配置

为了使用该插件,需要配置依赖注入并初始化核心配置。以下是示例设置:

// 配置核心依赖注入
coreDILocator.registerLazySingleton<CoreConfiguration>(() => CoreConfiguration(
  baseUrl: coreDILocator<AppEnvironment>().brandConfig.url.orEmpty(),
  timeout: 120000,
  connectTimeout: 120000,
  cachePolicy: coreDILocator<AppEnvironment>().env == EnvironmentType.prod || 
               coreDILocator<AppEnvironment>().env == EnvironmentType.dev
               ? CachePolicy.request
               : CachePolicy.noCache,
  refreshTokenUrl: authUrl,
  refreshTokenKey: "refresh_token",
  accessTokenKey: "access_token",
  securityContext: _securityContext,
  additionalHeaders: {
    // 添加自定义头信息
    "locale": "en",
    "unique-reference-code": "GUID",
  },
  storageProviderForToken: StorageProvider.sharedPref,
  loggerConfig: const LoggerConfig(
    shouldShowLogs: kDebugMode,
    logLevel: LogsLevel.trace,
    lineLength: 1000,
  ),
));

// 获取 CoreConfiguration 实例
final core = coreDILocator<CoreConfiguration>();

// 注册网络相关的依赖项
core.setup();

创建自定义仓库

您可以扩展 BaseRepository 类来创建自己的仓库。以下是示例代码:

class MyCustomRepository extends BaseRepository<GlobalMasterConfigData> {
  MyCustomRepository(NetworkExecutor networkExecutor) : super(networkExecutor);

  Future<Result<MyUiModel>> fetchData() async {
    final additionalHeaders = {
      'Authorization': 'Bearer your_token',
    };

    return await execute<MyMapper, GlobalMasterConfigData, MyUiModel>(
      urlPath: '/api/data',
      method: METHOD_TYPE.GET,
      params: EmptyRequest(),
      mapper: MyMapper(),
      responseType: GlobalMasterConfigData(),
      headers: additionalHeaders,
      cachePolicy: CachePolicy.cacheFirst,
      retryPolicy: RetryPolicy(retrialCount: 3, retryDelay: Duration(seconds: 2)),
    );
  }
}

高级功能

API 缓存

插件支持缓存以提高性能。可以在调用 execute 方法时指定缓存行为:

cachePolicy: CachePolicy.cacheFirst,

更新头部信息

可以通过传递额外的头部信息来自定义请求头部:

final additionalHeaders = {
  'Authorization': 'Bearer your_token',
};

重试策略

内置的重试策略允许您定义重试次数和每次重试之间的延迟:

retryPolicy: RetryPolicy(retrialCount: 3, retryDelay: Duration(seconds: 2)),

日志记录

通过 LoggerConfig 配置日志行为,便于跟踪请求和响应:

loggerConfig: const LoggerConfig(
  shouldShowLogs: kDebugMode,
  logLevel: LogsLevel.trace,
  lineLength: 1000,
)

使用 Log.d, Log.i, 和 Log.e 在不同级别记录消息:

Log.d('This is debug message');
Log.i('This is info message');
Log.e('This is error message');

本地存储设置

可以通过创建自己的 AppDataStorage 类来管理本地数据存储。以下是一个简单的实现示例:

locator 中设置本地存储依赖项:

coreDILocator.registerLazySingleton<LocalStorageService>(() {
  final storageManager = LocalStorageManager();
  storageManager.addService(SharedPrefStorageProvider());
  storageManager.init();
  return storageManager;
});

/// 使用 GetIt 设置本地存储依赖项
coreDILocator.registerLazySingleton<AppDataStorage>(
  () => AppDataStorage(coreDILocator<LocalStorageService>(), StorageProvider.sharedPref),
);

class AppDataStorage {
  final LocalStorageService localStorage;
  final StorageProvider provider;

  AppDataStorage(this.localStorage, this.provider);

  Future<void> saveMyAppData(String key, dynamic value) async {
    await localStorage.saveData(StorageData({key: value}, provider));
  }

  Future<T?> getValueByKey<T>(String key) async {
    return await localStorage.getData<T>(key, provider);
  }

  Future<void> clearValue(String key) async {
    await localStorage.removeData(key, provider);
  }
}

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

1 回复

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


network_plus 是一个 Flutter 插件,用于增强网络请求功能。它基于 http 包,提供了更多的功能和便利性,例如自动重试、超时设置、缓存、拦截器等。以下是如何使用 network_plus 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  network_plus: ^1.0.0  # 请检查最新版本

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

2. 导入包

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

import 'package:network_plus/network_plus.dart';

3. 创建 NetworkPlus 实例

你可以创建一个 NetworkPlus 实例来执行网络请求:

final networkPlus = NetworkPlus();

4. 发送 GET 请求

使用 get 方法发送 GET 请求:

void fetchData() async {
  try {
    final response = await networkPlus.get(Uri.parse('https://jsonplaceholder.typicode.com/posts'));
    if (response.statusCode == 200) {
      print('Response data: ${response.body}');
    } else {
      print('Request failed with status: ${response.statusCode}');
    }
  } catch (e) {
    print('Error: $e');
  }
}

5. 发送 POST 请求

使用 post 方法发送 POST 请求:

void postData() async {
  try {
    final response = await networkPlus.post(
      Uri.parse('https://jsonplaceholder.typicode.com/posts'),
      body: {'title': 'foo', 'body': 'bar', 'userId': '1'},
    );
    if (response.statusCode == 201) {
      print('Response data: ${response.body}');
    } else {
      print('Request failed with status: ${response.statusCode}');
    }
  } catch (e) {
    print('Error: $e');
  }
}

6. 设置超时和重试

network_plus 允许你设置请求超时和自动重试:

final networkPlus = NetworkPlus(
  timeout: Duration(seconds: 10),
  retryPolicy: RetryPolicy(maxRetries: 3),
);

7. 使用拦截器

你可以添加拦截器来处理请求和响应:

networkPlus.addInterceptor((request) {
  print('Request: ${request.url}');
  return request;
});

networkPlus.addResponseInterceptor((response) {
  print('Response: ${response.statusCode}');
  return response;
});

8. 使用缓存

network_plus 还支持缓存功能。你可以启用缓存来存储响应数据:

final networkPlus = NetworkPlus(
  cachePolicy: CachePolicy(
    maxAge: Duration(hours: 1),
  ),
);

9. 处理错误

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

void fetchData() async {
  try {
    final response = await networkPlus.get(Uri.parse('https://jsonplaceholder.typicode.com/posts'));
    if (response.statusCode == 200) {
      print('Response data: ${response.body}');
    } else {
      print('Request failed with status: ${response.statusCode}');
    }
  } catch (e) {
    print('Error: $e');
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!