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'
我们从初始化库开始。在这里,你可以通过提供如baseUrl
、baseOptions
和networkConnection
等参数来给项目赋予这些功能。
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发送请求。它接受泛型类型R
和T
。
R
类型指定请求的返回类型。基于库中提供的responseModel
,服务器收到的数据会被自动解析。你将在IResponseModel
中接收到所需的模型。如果发生错误,IResponseModel
不会返回一个空的IErrorModel
,而是提供statusCode
、errorMessage
和NetworkExceptions
。
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
更多关于Flutter网络请求插件dio_nexus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用dio_nexus
插件进行网络请求的示例代码。dio_nexus
是dio
的一个扩展,提供了更高级的功能,比如依赖注入、全局配置等。在这个例子中,我们将展示如何设置dio_nexus
,并进行一个简单的GET请求。
首先,确保你的pubspec.yaml
文件中包含了dio
和dio_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),
),
);
}
}
在这个示例中,我们做了以下几件事:
- 使用
GetIt
进行依赖注入管理。 - 配置了
dio
的基础选项,如baseUrl
、connectTimeout
和receiveTimeout
。 - 注册了
dio
和dio_nexus
的实例。 - 在
HomeScreen
组件的initState
方法中,使用dio_nexus
进行了一个GET请求,并将响应数据显示在屏幕上。
请注意,你需要将baseUrl
和API端点替换为你自己的API信息。这个示例提供了一个基础框架,你可以根据需要进行扩展和修改。