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');
  }
}
回到顶部