Flutter功能扩展插件ccci_utility的使用

Flutter功能扩展插件ccci_utility的使用

本文档提供了CCCI Utils的概述,包括自定义小部件、实用类和网络处理。

目录

实用类

BaseApi

BaseApi 类是一个用于使用Dio HTTP客户端进行API调用的基础类。它简化了与RESTful API交互的过程,通过Dio库处理常见的任务,如构建路由、发送请求和错误处理。

使用

该类可以通过传递一个路由和一个 DioClient 实例来构建特定的API服务。每个方法都支持可选参数来自定义请求,例如查询参数或请求路径。

示例
final userApi = BaseApi('/users', dioClient);
final user = await userApi.getById('123');
关键概念
  • Dio:一个强大的Dart HTTP客户端,允许轻松地发起HTTP请求。
  • 错误处理:API请求中的错误使用 AppLogger 进行记录,并重新抛出以便在应用层进行进一步处理。
  • 自定义:每个方法都允许通过可选的查询参数或路径进行定制,使其适用于各种API请求。
参数
  • String route:API服务的基本路由(或端点)。这是所有HTTP请求的起点。
  • DioClient dioClient:用于执行网络请求的Dio HTTP客户端实例。
构造函数
  • BaseApi(this.route, this.dioClient)
    • 接受一个 route 和一个 dioClient 用于向API发起请求。
方法
  • getById:发送 GET 请求以获取具有唯一ID的资源。
  • get:发送 GET 请求以获取资源,可选地带有查询参数或特定路径。
  • post:发送 POST 请求以创建具有有效负载的新资源。
  • put:发送 PUT 请求以更新具有唯一ID的现有资源。
  • delete:发送 DELETE 请求以删除具有唯一ID的资源。
基础类扩展示例
class UserApi extends BaseApi {
  UserApi(DioClient dioClient) : super('/users', dioClient);

  Future fetchUsers() => get();
}

在这个例子中,UserApi 类扩展了 BaseApi 并使用 get 方法从 /users 端点获取用户列表。

BaseRepository

BaseRepository 是一个通用的存储库类,用于从API检索和管理数据。

使用

该类是抽象的,应由具体的存储库为单独的数据实体进行扩展。每个存储库应该定义 fromJson 方法,负责将JSON响应转换为模型对象。

示例
class UserRepository extends BaseRepository<User> {
  UserRepository(BaseApi api) : super(api, (json) => User.fromJson(json));
}
关键概念
  • BaseApi:用于执行HTTP请求的服务。此类使用 BaseApi 进行所有API交互,如GET、POST、PUT和DELETE请求。
  • 模型转换fromJson 函数需要将API返回的JSON数据转换为模型对象类型 [T]
  • 错误处理:错误被捕获并使用 AppLogger 记录,原始错误被重新抛出以便进行更高级别的处理。
参数
  • BaseApi api:用于执行HTTP请求的API服务。
  • T Function(Map<String, dynamic>) fromJson:一个函数,将JSON映射转换为模型类 [T] 的实例。
构造函数
  • BaseRepository(this.api, this.fromJson)
    • 接受一个 [api] 实例和一个 [fromJson] 函数来初始化存储库。
方法
  • get:使用可选查询参数从API检索实体列表。
  • getById:使用可选查询参数检索具有唯一标识符的单个实体。
基础类扩展示例
class ProductRepository extends BaseRepository<Product> {
  ProductRepository(BaseApi api) : super(api, (json) => Product.fromJson(json));

  Future<List<Product>> fetchProducts({Map<String, dynamic>? filters}) {
    return get(queryParameters: filters);
  }

  Future<Product> fetchProductById(String id) {
    return getById(id);
  }
}

在这个例子中,ProductRepository 扩展了 BaseRepository 来处理产品相关的API调用,例如获取产品列表或通过ID获取单个产品。

BaseServiceProvider

BaseServiceProvider 是一个抽象基类,用于使用Riverpod创建服务提供者。

使用

要创建服务提供者,可以扩展这个 BaseServiceProvider 类并在自定义提供者类中实现特定业务逻辑。

示例
class AuthServiceProvider extends BaseServiceProvider {
  AuthServiceProvider(ProviderRef ref) : super(ref);

  void signIn(String email, String password) {
    // 逻辑处理用户登录,使用 ref 与提供者进行交互。
  }
}

这允许你集中处理特定功能的逻辑,如认证、网络或数据存储,并通过Riverpod在整个应用程序中共享这些功能。

关键概念
  • ProviderRef:一个用于与其它提供者交互或在Riverpod中管理状态的句柄。ProviderRef 对象对于访问其他提供者和与全局提供者系统交互至关重要。
  • 可扩展性BaseServiceProvider 可以扩展以创建专用的服务提供者。每个派生类都将继承对 ref 字段的访问权限,允许依赖注入或与其他提供者交互。
  • Riverpod:此部分属于使用Riverpod进行状态管理的项目,Riverpod提供了一种声明式的方式来管理依赖关系和应用程序状态。
参数
  • ProviderRef ref:此服务提供者将使用的Riverpod提供者的引用。
属性
  • ref:一个类型为 ProviderRef 的私有字段,提供了对Riverpod框架内其他提供者的访问。
构造函数
  • BaseServiceProvider(ProviderRef ref)
    • 接受一个 ProviderRef 作为参数,并将其分配给私有字段 ref 供派生服务提供者未来使用。
基础类扩展示例
class NetworkServiceProvider extends BaseServiceProvider {
  NetworkServiceProvider(ProviderRef ref) : super(ref);

  Future<void> fetchData() async {
    // 使用 ref 访问其他提供者或状态管理。
    // 示例:final apiService = ref.read(apiServiceProvider);
  }
}

在这个例子中,NetworkServiceProvider 继承了 BaseServiceProvider 并使用 refapiServiceProvider 等其他提供者进行交互。

AppLogger

AppLogger 类是一个用于在应用程序中不同严重级别上记录消息的实用类。它提供了用于记录调试、信息、警告、错误和详细消息的静态方法。此外,它还包括用于记录API请求、响应和错误的方法。

使用
AppLogger.debug('Debug message');
AppLogger.error('Error message');
AppLogger.logApiRequest(url: 'https://api.example.com', method: 'GET');

RouteHandler

RouteHandler 类是一个用于处理应用程序内部导航操作的实用类。它提供了用于在导航器堆栈中推送、弹出和替换路由的方法。这些方法有助于在应用程序的不同屏幕和组件之间进行无缝导航。

示例
RouteHandler.push(context, HomePage());
RouteHandler.pop(context);

DioExceptions

DioExceptions 类是一个自定义异常类,用于处理Dio请求中的错误。它基于不同的Dio异常类型提供自定义错误消息,包括连接超时、接收超时、不良响应和未知错误。

使用
try {
  // Dio请求
} catch (e) {
  if (e is DioException) {
    final dioException = DioExceptions.fromDioError(e);
    print(dioException.message);
  }
}

DioClient

DioClient 类封装了使用Dio包进行HTTP请求的功能。它包括带有可配置选项和拦截器的GET、POST、PUT和DELETE请求的方法。该类提供了一种方便高效的方式与API交互并处理应用程序内的网络请求。

Dart依赖项

要使用 DioClient,你需要在 pubspec.yaml 中包含以下Dart包:

dependencies:
    dio
    flutter_dotenv
配置文件

确保你有必要的配置文件:

  1. .env
使用
BASE_URL=<your_base_url>
  1. config.json
使用
{
  "development": {
    "current": true,
    "baseUrl": "https://dev.example.com"
  },
  "production": {
    "current": false,
    "baseUrl": "https://api.example.com"
  }
}

更多关于Flutter功能扩展插件ccci_utility的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


ccci_utility 是一个 Flutter 插件,旨在为开发者提供一些实用的功能扩展。由于这个插件并不是 Flutter 官方或广泛使用的插件,具体功能和使用方法可能会根据插件的版本和开发者的需求有所不同。以下是一个典型的使用步骤和示例代码,帮助你了解如何使用 ccci_utility 插件。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 ccci_utility 插件的依赖。确保你使用的是最新版本。

dependencies:
  flutter:
    sdk: flutter
  ccci_utility: ^1.0.0  # 根据实际情况替换为最新版本

然后,运行 flutter pub get 来获取并安装插件。

2. 导入插件

在你的 Dart 文件中导入 ccci_utility 插件:

import 'package:ccci_utility/ccci_utility.dart';

3. 使用插件功能

ccci_utility 插件可能包含各种实用功能,例如日期格式化、网络请求、本地存储等。以下是一些常见的用法示例:

示例 1: 日期格式化

假设插件提供了一个日期格式化的功能:

void main() {
  DateTime now = DateTime.now();
  String formattedDate = CcciUtility.formatDate(now, 'yyyy-MM-dd');
  print('Formatted Date: $formattedDate');
}

示例 2: 网络请求

如果插件提供了网络请求功能,你可以这样使用:

void fetchData() async {
  var response = await CcciUtility.fetchData('https://api.example.com/data');
  print('Response: $response');
}

示例 3: 本地存储

如果插件提供了本地存储功能,你可以这样使用:

void saveData() async {
  await CcciUtility.saveData('key', 'value');
}

void getData() async {
  var value = await CcciUtility.getData('key');
  print('Value: $value');
}

4. 查看文档

由于 ccci_utility 插件的功能可能非常具体,建议你查看插件的官方文档或源代码,以了解所有可用的功能及其详细用法。

5. 处理错误和异常

在使用插件时,确保处理可能出现的错误和异常,例如网络请求失败或本地存储读取失败的情况。

void fetchData() async {
  try {
    var response = await CcciUtility.fetchData('https://api.example.com/data');
    print('Response: $response');
  } catch (e) {
    print('Error: $e');
  }
}
回到顶部