Flutter网络请求插件wat_dio的使用
Flutter网络请求插件wat_dio的使用
概述
wat_dio
是一个基于 Dio
的 Flutter 插件,主要用于处理基于 JSON Web Token (JWT) 的过期刷新令牌问题。它通过拦截器机制捕获 HTTP 响应并自动处理令牌刷新逻辑。
安装
在你的 pubspec.yaml
文件中添加以下依赖:
dependencies:
wat_dio: ^0.0.3
然后运行以下命令以安装依赖:
flutter pub get
使用示例
以下是一个完整的示例,展示了如何使用 wat_dio
进行网络请求。
示例代码
import 'package:flutter/material.dart';
import 'package:wat_dio/wat_dio.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'WatDio 示例',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(
title: 'WatDio 示例',
),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'点击按钮测试 API 调用',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headlineLarge,
),
],
),
),
floatingActionButton: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
const SizedBox(
width: 20,
),
FloatingActionButton(
onPressed: () async {
String baseApi = "https://rickandmortyapi.com/api";
// 初始化 Dio 实例
final dio = Dio(
BaseOptions(
baseUrl: baseApi,
validateStatus: (value) {
return value! < 500;
},
),
);
// 创建 RestService 实例
var service = RestService(
dioClient: dio,
expiredToken: (Response<dynamic> response, ResponseInterceptorHandler handler) async {
// 处理过期令牌的逻辑
print('令牌已过期,需要刷新...');
// 在这里实现刷新令牌的逻辑,例如调用后端接口获取新令牌
// 返回 true 表示成功刷新令牌
return true;
},
);
// 调用 API
try {
final response = await service.get(endpoint: "/character");
print('API 响应: ${response.data}');
} catch (e) {
print('请求失败: $e');
}
},
tooltip: '测试 API 调用',
child: const Text("测试 API"),
),
const Spacer(),
FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
],
),
);
}
}
更多关于Flutter网络请求插件wat_dio的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter网络请求插件wat_dio的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
wat_dio
是一个基于 Dio
的 Flutter 网络请求插件,它提供了更加简洁和易用的 API 来处理网络请求。Dio
本身是一个非常强大的网络请求库,而 wat_dio
则在此基础上进行了封装和扩展,使得开发者可以更轻松地进行网络请求。
安装
首先,你需要在 pubspec.yaml
文件中添加 wat_dio
依赖:
dependencies:
flutter:
sdk: flutter
wat_dio: ^1.0.0 # 请根据实际情况选择最新版本
然后运行 flutter pub get
来安装依赖。
基本使用
1. 初始化 WatDio
在应用启动时,你可以初始化 WatDio
实例:
import 'package:wat_dio/wat_dio.dart';
void main() {
WatDio watDio = WatDio(
baseUrl: 'https://api.example.com',
connectTimeout: 5000,
receiveTimeout: 3000,
);
runApp(MyApp(watDio: watDio));
}
class MyApp extends StatelessWidget {
final WatDio watDio;
MyApp({required this.watDio});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: MyHomePage(watDio: watDio),
);
}
}
2. 发起 GET 请求
class MyHomePage extends StatelessWidget {
final WatDio watDio;
MyHomePage({required this.watDio});
Future<void> fetchData() async {
try {
Response response = await watDio.get('/users');
print(response.data);
} catch (e) {
print('Error: $e');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Demo Home Page'),
),
body: Center(
child: ElevatedButton(
onPressed: fetchData,
child: Text('Fetch Data'),
),
),
);
}
}
3. 发起 POST 请求
Future<void> postData() async {
try {
Response response = await watDio.post(
'/users',
data: {
'name': 'John Doe',
'email': 'john.doe@example.com',
},
);
print(response.data);
} catch (e) {
print('Error: $e');
}
}
4. 处理请求头和拦截器
你可以在初始化 WatDio
时添加全局的请求头或拦截器:
WatDio watDio = WatDio(
baseUrl: 'https://api.example.com',
headers: {
'Authorization': 'Bearer your_token_here',
},
);
// 添加拦截器
watDio.interceptors.add(InterceptorsWrapper(
onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
// 在请求之前做一些处理
print('Request: ${options.uri}');
handler.next(options);
},
onResponse: (Response response, ResponseInterceptorHandler handler) {
// 在响应之后做一些处理
print('Response: ${response.data}');
handler.next(response);
},
onError: (DioError error, ErrorInterceptorHandler handler) {
// 在错误发生时做一些处理
print('Error: ${error.message}');
handler.next(error);
},
));
高级功能
wat_dio
还提供了一些高级功能,例如:
- 文件上传:使用
FormData
来上传文件。 - 文件下载:使用
download
方法来下载文件。 - 取消请求:使用
CancelToken
来取消请求。
示例:文件上传
Future<void> uploadFile() async {
FormData formData = FormData.fromMap({
'file': await MultipartFile.fromFile('path/to/file', filename: 'upload.jpg'),
});
try {
Response response = await watDio.post('/upload', data: formData);
print(response.data);
} catch (e) {
print('Error: $e');
}
}