Flutter网络请求插件dio_nexus的使用

Flutter网络请求插件dio_nexus的使用

开发者: Safa ULUDOĞAN

GitHub: https://github.com/safauludogan/dio_nexus


Dio Nexus

该库是在Dio之上构建的网络管理层。

  • 它会自动解析来自API的JSON数据并将其作为模型类返回给你。
  • 它将生成的异常转换为其自己的异常类型,然后返回这些异常。
  • 它会自动使用刷新令牌发送刷新令牌请求。

开始使用

添加依赖

你可以使用以下命令添加dio_nexus作为依赖项,并使用最新稳定版本:

$ dart pub add dio_nexus

或者,你可以在pubspec.yaml文件的dependencies部分手动添加dio_nexus:

dio_nexus: '^replace-with-latest-version'

我们从初始化库开始。在这里,你可以通过提供如baseUrlbaseOptionsnetworkConnection等参数来给项目赋予这些功能。

import 'package:dio_nexus/dio_nexus.dart';

IDioNexusManager networkManager = DioNexusManager(
  printLogsDebugMode: false,
  options: BaseOptions(
    baseUrl: "https://reqres.in/",
    headers: {'Content-type': 'application/json'},
    receiveTimeout: const Duration(seconds: 15),
    connectTimeout: const Duration(seconds: 15)
  )
);

模型解析器

库中的sendRequest函数允许你向API发送请求。它接受泛型类型RT

R类型指定请求的返回类型。基于库中提供的responseModel,服务器收到的数据会被自动解析。你将在IResponseModel中接收到所需的模型。如果发生错误,IResponseModel不会返回一个空的IErrorModel,而是提供statusCodeerrorMessageNetworkExceptions

T类型表示你要解析的模型。你的模型类,代表JSON数据,应该继承自IDioNexusNetworkModel。这允许库执行解析过程。

Future<IResponseModel<R?>?> sendRequest<T extends IDioNexusNetworkModel<T>, R>();

刷新令牌

使用刷新令牌处理过期令牌。在认证失败的情况下,给定的刷新令牌将起作用。

IDioNexusManager networkManager = DioNexusManager(
  onRefreshFail: () {
    // 当刷新令牌失败时要采取的操作。
  },
  onRefreshToken: (error, options) {
    // 编写你的刷新令牌代码。
  },
  options: BaseOptions(
    baseUrl: "https://reqres.in/",
    headers: {NetworkHeadersEnum.ContentType.value: "application/json"},
    receiveTimeout: const Duration(seconds: 15),
    connectTimeout: const Duration(seconds: 15)
  )
);

本地化

当你想要翻译应用程序时,可以随时调用translate函数,并提供语言代码。它支持土耳其语和英语。例如:Locale('tr')Locale('en')

IDioNexusManager networkManager = DioNexusManager(
  options: BaseOptions(
    baseUrl: "https://reqres.in/",
    headers: {NetworkHeadersEnum.ContentType.value: "application/json"},
    receiveTimeout: const Duration(seconds: 15),
    connectTimeout: const Duration(seconds: 15)
  ),
  locale: const Locale('tr'),
  networkConnection: NetworkConnection(
    context: context,
    snackbarDuration: const Duration(seconds: 5)
  )
);

网络连接

在网络连接不可用的情况下,它会显示一个通知用户没有互联网的消息。通过点击“重试”按钮,用户可以重新发送之前的请求。

IDioNexusManager networkManager = DioNexusManager(
  options: BaseOptions(
    baseUrl: "https://reqres.in/",
    headers: {NetworkHeadersEnum.ContentType.value: "application/json"},
    receiveTimeout: const Duration(seconds: 15),
    connectTimeout: const Duration(seconds: 15)
  ),
  networkConnection: NetworkConnection(
    context: context,
    snackbarDuration: const Duration(seconds: 5)
  )
);

无网络连接


超时请求

当服务器没有响应或无法访问时,默认情况下会显示一个超时的通知。要使用它,只需提供构造函数。

IDioNexusManager networkManager = DioNexusManager(
  options: BaseOptions(
    baseUrl: "https://reqres.in/",
    headers: {NetworkHeadersEnum.ContentType.value: "application/json"},
    receiveTimeout: const Duration(seconds: 15),
    connectTimeout: const Duration(seconds: 15)
  ),
  timeoutToast: TimeoutToast(showException: true)
);

请求超时


自定义拦截器

你可以添加自己的自定义拦截器。

IDioNexusManager networkManager = DioNexusManager(
  interceptor: MyInterceptor(),
  options: BaseOptions(
    baseUrl: "https://reqres.in/",
    headers: {NetworkHeadersEnum.ContentType.value: "application/json"},
    receiveTimeout: const Duration(seconds: 15),
    connectTimeout: const Duration(seconds: 15)
  )
);

示例

返回Users类型:

Future<IResponseModel<Users?>?> getUsers() async {
  IResponseModel<Users?>? response = await nexusManager.sendRequest<Users, Users>(
    "api/users",
    requestType: RequestType.GET,
    responseModel: Users()
  );
  return response;
}

返回Model类型:

Future<IResponseModel<List<Model>?>?> request() async {
  return await nexusManager.sendRequest<Model, List<Model>>(
    'api/path',
    responseModel: Model(),
    requestType: RequestType.GET,
    queryParameters: {"key": value}
  );
}

当服务器不返回JSON数据作为响应时,这由NexusModel处理。根据从服务器接收到的数据,你提供一个T类型。这个T类型可以是String、int、bool、double或dynamic。响应将根据你指定的T类型进行解析并呈现给你。

Future<IResponseModel<NexusModel<String>?>?> request() async {
  return await nexusManager.sendRequest<NexusModel, NexusModel<String>>(
    'api/path',
    responseModel: NexusModel<String>(),
    requestType: RequestType.GET,
    queryParameters: {"key": value}
  );
}

特性

在初始化DioNexusManager时,你可以提供以下属性:

/// [onRefreshToken] 当HttpStatus返回未经授权时,你可以调用你的刷新令牌管理器
Future Function(DioException error, BaseOptions options)? onRefreshToken;

/// 如果[onRefreshToken]返回失败,此方法将工作。
///
/// 示例:当refreshToken失败时,应用将注销。
Function? onRefreshFail;

/// 设置为true以打印接收的请求或错误。
final bool? printLogsDebugMode;

/// 当没有互联网连接时,再次向服务器请求
NetworkConnection? networkConnection;

/// 显示超时时的提示。
/// 默认值为false。
TimeoutToast? timeoutToast;

/// 此变量用于无互联网连接。
/// 初始化[DioNexusManager]时可以修改此计数器。
/// 当你的互联网连接丢失时,你可以尝试最多5次重新请求。
int maxNetworkTryCount;

/// 获取所有拦截器
Interceptors get showInterceptors;

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用dio_nexus插件进行网络请求的示例代码。dio_nexusdio的一个扩展,提供了更高级的功能,比如依赖注入、全局配置等。在这个例子中,我们将展示如何设置dio_nexus,并进行一个简单的GET请求。

首先,确保你的pubspec.yaml文件中包含了diodio_nexus的依赖:

dependencies:
  flutter:
    sdk: flutter
  dio: ^4.0.0
  dio_nexus: ^0.2.0  # 请检查最新版本号

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

接下来,在你的Flutter项目中设置dio_nexus。以下是一个简单的示例,展示如何配置和使用dio_nexus

import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'package:dio_nexus/dio_nexus.dart';
import 'package:get_it/get_it.dart';

// 创建GetIt实例
final GetIt sl = GetIt.instance;

void setupLocator() {
  // 配置dio
  sl.registerSingleton<BaseOptions>(BaseOptions(
    baseUrl: 'https://api.example.com', // 替换为你的API基础URL
    connectTimeout: 5000,
    receiveTimeout: 3000,
  ));

  // 配置dio_nexus
  sl.registerFactory<Dio>(() => Dio(sl<BaseOptions>()));
  sl.registerFactory<DioNexus>(() => DioNexus(dio: sl<Dio>()));
}

void main() {
  // 在应用启动时设置依赖
  setupLocator();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  String responseData = '';

  @override
  void initState() {
    super.initState();
    _fetchData();
  }

  Future<void> _fetchData() async {
    final DioNexus dioNexus = sl<DioNexus>();

    try {
      // 使用dioNexus进行GET请求
      Response response = await dioNexus.get('/endpoint'); // 替换为你的API端点
      setState(() {
        responseData = response.data.toString();
      });
    } catch (e) {
      // 处理请求错误
      setState(() {
        responseData = 'Error: ${e.message}';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('dio_nexus Example'),
      ),
      body: Center(
        child: Text(responseData),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 使用GetIt进行依赖注入管理。
  2. 配置了dio的基础选项,如baseUrlconnectTimeoutreceiveTimeout
  3. 注册了diodio_nexus的实例。
  4. HomeScreen组件的initState方法中,使用dio_nexus进行了一个GET请求,并将响应数据显示在屏幕上。

请注意,你需要将baseUrl和API端点替换为你自己的API信息。这个示例提供了一个基础框架,你可以根据需要进行扩展和修改。

回到顶部