Flutter网络请求插件try_dio的使用

Flutter网络请求插件try_dio的使用

TryDio 是一个用于简化 Flutter 应用程序网络操作的 Dart 包。它提供了一个强大的框架来进行 HTTP 请求,并优雅地处理在通信过程中可能出现的各种异常和错误。通过将直接 HTTP 调用和错误处理的复杂性抽象为简单的统一 API,TryDio 使开发者能够专注于构建应用的核心功能,而无需担心底层网络层的细节。

安装

要在 Flutter 项目中使用 TryDio,请将其作为依赖项添加到 pubspec.yaml 文件中:

dependencies:
  try_dio: ^0.0.6

然后运行 flutter pub get 来安装依赖包。

使用

基本示例

以下示例演示了如何使用 safeCall 函数来执行网络请求并以安全、可预测的方式处理响应或错误。

import 'package:try_dio/try_dio.dart'; // 导入必要的模块

void main() async {
  final result = await safeCall<String>(() async {
    // 这里进行 HTTP 请求,例如使用 Dio
    return "成功从服务器获取的响应";
  });

  if (result.isSuccess()) {
    print(result.result()); // 处理成功的响应
  } else {
    print(result.error().code); // 处理错误
  }
}

异常处理

以下是你可以如何处理 safeCall 函数返回的不同类型的异常:

class AuthRemoteDataSourceImpl implements AuthRemoteDataSource {
  final AuthApi api;
  AuthRemoteDataSourceImpl({required this.api});

  @override
  FutureTry<GetSmsCodeResponse> getSmsCode(GetSmsCodeRequest request) {
    return safeCall(() => api.getSmsCode(request));
  }

  @override
  FutureTry<void> logOut(String token) {
    return safeCall(() => api.logOut(token));
  }

  @override
  FutureTry<void> setSecureCode(SetSecureCodeRequest request) {
    return safeCall(() => api.setSecureCode(request));
  }

  @override
  FutureTry<ValidateTokenResponse> validateToken(ValidateTokenRequest request) {
    return safeCall(() => api.validateToken(request));
  }

  @override
  FutureTry<VerifySecureCodeResponse> verifySecureCode(VerifySecureCodeRequest request) {
    return safeCall(() => api.verifySecureCode(request));
  }

  @override
  FutureTry<VerifySmsCodeResponse> verifySmsCode(VerifySmsCodeRequest request) {
    return safeCall(() => api.verifySmsCode(request));
  }
}

注意事项

  • 确保正确处理异步操作,使用 asyncawait
  • 使用类型检查(is)来处理特定的错误。

完整示例 Demo

以下是一个完整的示例 Demo,展示了如何使用 TryDio 处理网络请求及其异常情况。

import 'package:dio/dio.dart';
import 'package:try_dio/try_dio.dart';

void main() async {
  final result = await safeCall<String>(() async {
    throw DioException(
      requestOptions: RequestOptions(path: 'https://example.com'),
      // 指定异常类型
      type: DioExceptionType.badCertificate,
      error: "连接错误",
    );
  });

  if (result.isSuccess()) {
    // 成功执行
  } else {
    final error = result.error();
    switch (error.runtimeType) {
      case HttpError:
        print((error as HttpError).statusCode);
        break;
      case ConnectionError:
        print((error as ConnectionError).code);
        break;
      case DtoError:
      case ParsingError:
      case UnknownError:
      case SocketError:
        print(error.code);
        break;
    }
  }
}

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

1 回复

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


try_dio 是一个基于 Dio 的 Flutter 网络请求插件,它简化了网络请求的使用,提供了更友好的 API 和错误处理机制。Dio 是一个强大的 Dart HTTP 客户端,支持拦截器、全局配置、FormData、请求取消等功能。

以下是如何在 Flutter 项目中使用 try_dio 插件的步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 try_dio 依赖:

dependencies:
  flutter:
    sdk: flutter
  try_dio: ^最新版本

然后运行 flutter pub get 来安装依赖。

2. 导入包

在需要使用 try_dio 的文件中导入包:

import 'package:try_dio/try_dio.dart';

3. 初始化 TryDio

在使用 try_dio 之前,你可以选择初始化它。通常,你可以在 main.dart 中进行全局初始化:

void main() {
  TryDio.init(
    baseUrl: 'https://jsonplaceholder.typicode.com',
    connectTimeout: 5000,
    receiveTimeout: 3000,
  );
  runApp(MyApp());
}

4. 发起网络请求

try_dio 提供了多种方法来发起网络请求,以下是几个常用的例子:

GET 请求

Future<void> fetchData() async {
  try {
    var response = await TryDio.get('/posts/1');
    print('Response data: ${response.data}');
  } catch (e) {
    print('Error: $e');
  }
}

POST 请求

Future<void> postData() async {
  try {
    var response = await TryDio.post('/posts', data: {
      'title': 'foo',
      'body': 'bar',
      'userId': 1,
    });
    print('Response data: ${response.data}');
  } catch (e) {
    print('Error: $e');
  }
}

PUT 请求

Future<void> updateData() async {
  try {
    var response = await TryDio.put('/posts/1', data: {
      'id': 1,
      'title': 'foo',
      'body': 'bar',
      'userId': 1,
    });
    print('Response data: ${response.data}');
  } catch (e) {
    print('Error: $e');
  }
}

DELETE 请求

Future<void> deleteData() async {
  try {
    var response = await TryDio.delete('/posts/1');
    print('Response data: ${response.data}');
  } catch (e) {
    print('Error: $e');
  }
}

5. 错误处理

try_dio 会自动处理网络请求中的错误,并将错误信息返回给调用者。你可以通过 try-catch 块来捕获并处理这些错误。

Future<void> fetchData() async {
  try {
    var response = await TryDio.get('/posts/1');
    print('Response data: ${response.data}');
  } on DioError catch (e) {
    print('DioError: ${e.message}');
  } catch (e) {
    print('Error: $e');
  }
}

6. 拦截器

try_dio 也支持拦截器,你可以在请求发起前或响应返回后进行一些操作。

TryDio.addInterceptor(InterceptorsWrapper(
  onRequest: (options, handler) {
    // 在请求发起前做一些操作
    print('Request: ${options.uri}');
    return handler.next(options);
  },
  onResponse: (response, handler) {
    // 在响应返回后做一些操作
    print('Response: ${response.data}');
    return handler.next(response);
  },
  onError: (DioError e, handler) {
    // 在发生错误时做一些操作
    print('Error: ${e.message}');
    return handler.next(e);
  },
));

7. 取消请求

try_dio 支持取消请求,你可以通过 CancelToken 来取消正在进行的请求。

CancelToken cancelToken = CancelToken();

Future<void> fetchData() async {
  try {
    var response = await TryDio.get('/posts/1', cancelToken: cancelToken);
    print('Response data: ${response.data}');
  } catch (e) {
    if (CancelToken.isCancel(e)) {
      print('Request cancelled');
    } else {
      print('Error: $e');
    }
  }
}

void cancelRequest() {
  cancelToken.cancel('Request cancelled by user');
}

8. 其他配置

try_dio 还支持其他配置,如设置请求头、超时时间、代理等。

TryDio.updateOptions(
  headers: {
    'Authorization': 'Bearer your_token',
  },
  connectTimeout: 10000,
  receiveTimeout: 10000,
);
回到顶部