Flutter网络扩展插件tbib_dio_extension的使用

发布于 1周前 作者 itying888 来自 Flutter

Flutter网络扩展插件tbib_dio_extension的使用

导入

import 'package:tbib_dio_extension/tbib_dio_extension.dart';

如何使用

在仓库中使用
if (await networkInfo.isConnected) {
  try {
    var res = await appServicesClient.getSettings();
    if (res.isSuccess) {
      return Success(res.toModel);
    } else {
      return Error(Failure(res.statusCode, res.errorMessage));
    }
  } catch (error) {
    return Error(FailureHandler.handle(error).failure);
  }
} else {
  // 失败
  // 返回左侧错误
  return Error(DataSource.NO_INTERNET_CONNECTION.getFailure());
}
在任何地方使用
// 在 main 中移除在 v 1.0.0 中baseUrl 可选
DioManger.init(baseUrl: 'baseUrl');

// 为自定义选项初始化 DioManager
DioManger.initWithCustomOption();

// 获取 Dio
var dio = DioManger.dioApi;

// 调用 API
try {
  var res = await dio.post('endpoint');
} catch (error) {
  // 从 Dio 获取错误
  ErrorHandler.handle(error).failure.messages;
}

// 你可以从 API 获取错误
// 示例 API 响应
{
  "result": null,
  "errorMessage": "Invalid userName Or Password",
}

示例代码

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:tbib_dio_extension/tbib_dio_extension.dart';

void main() {
  DioManger.init();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // 这个 widget 是你应用程序的根。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // 这是你应用程序的主题。
        //
        // 尝试运行你的应用程序与 "flutter run"。你会看到一个蓝色的工具栏。然后,不退出应用程序的情况下,尝试将 primarySwatch 下面的颜色更改为 Colors.green 并重新加载。
        // 注意到计数器没有重置回零;应用程序没有重启。
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final String title;

  const MyHomePage({super.key, required this.title});

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class TokenInterceptor extends Interceptor {
  [@override](/user/override)
  Future<void> onError(
    DioException err,
    ErrorInterceptorHandler handler,
  ) async {
    if (err.response?.statusCode == 403 || err.response?.statusCode == 401) {
      // 移除缓存登录并导航至登录页面
    }
    super.onError(err, handler);
  }

  [@override](/user/override)
  Future<void> onRequest(
    RequestOptions options,
    RequestInterceptorHandler handler,
  ) async {
    // 获取用户令牌并发送到头部
    super.onRequest(options, handler);
  }

  [@override](/user/override)
  Future<void> onResponse(
    Response response,
    ResponseInterceptorHandler handler,
  ) async {
    super.onResponse(response, handler);
  }
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    // 每次 setState 被调用时,这个方法都会被重新运行,例如通过 _incrementCounter 方法上面。
    //
    // Flutter 框架已经优化了重新构建 build 方法的速度,因此你可以只更新需要更新的任何东西而不是单独更改 widget 的实例。
    return Scaffold(
      appBar: AppBar(
        // 这里我们从 MyHomePage 对象中获取标题,并将其设置为应用栏的标题。
        title: Text(widget.title),
      ),
      // 这个尾部逗号使自动格式化更友好于 build 方法。
    );

    void getDataApi() async {
      var dio = DioManger.dioApi;
      try {
        debugPrint("dio url is ${(dio.options.baseUrl)}");
        var res = await dio.post('/endpoint', data: {});
        debugPrint("dio url is ${res.realUri}");
        res.data;
      } catch (error) {
        debugPrint(
            "error catch is ${ErrorHandler.handle(error, messageFromApi: (error is DioException) ? error.response?.data['errorMessage'] : null).failure.messages}");
      }
    }

    [@override](/user/override)
    void initState() {
      getDataApi();
      super.initState();
    }
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用tbib_dio_extension网络扩展插件的示例代码。tbib_dio_extension是基于dio库的一个扩展插件,用于简化网络请求并增加一些额外的功能。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加tbib_dio_extensiondio的依赖:

dependencies:
  flutter:
    sdk: flutter
  dio: ^4.0.0
  tbib_dio_extension: ^最新版本号 # 请替换为实际最新版本号

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

2. 初始化插件

在你的项目中创建一个dio实例,并使用tbib_dio_extension进行扩展。

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

class HttpClient {
  static final HttpClient _instance = HttpClient._();
  Dio _dio;

  factory HttpClient() => _instance;

  HttpClient._() {
    BaseOptions options = BaseOptions(
      baseUrl: "https://api.example.com", // 替换为你的API基础URL
      connectTimeout: 5000,
      receiveTimeout: 3000,
    );

    _dio = Dio(options)
      ..interceptors.add(LogInterceptor(
        requestBody: true,
        responseBody: true,
      ))
      ..transformers.add(JsonTransformer())
      ..extendWith(DioExtension()); // 添加tbib_dio_extension扩展
  }

  Dio get dio => _dio;
}

3. 使用扩展功能

tbib_dio_extension提供了一些便捷方法来处理请求和响应。下面是一个简单的GET请求示例:

import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'package:tbib_dio_extension/tbib_dio_extension.dart';
import 'http_client.dart'; // 导入上面创建的HttpClient类

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Dio Extension Demo'),
        ),
        body: Center(
          child: FutureBuilder<Map<String, dynamic>>(
            future: fetchData(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                if (snapshot.hasError) {
                  return Text('Error: ${snapshot.error}');
                } else {
                  return Text('Data: ${snapshot.data?['data']}');
                }
              } else {
                return CircularProgressIndicator();
              }
            },
          ),
        ),
      ),
    );
  }

  Future<Map<String, dynamic>> fetchData() async {
    try {
      Response<Map<String, dynamic>> response = await HttpClient().dio.get('/endpoint'); // 替换为你的实际API端点
      return response.data;
    } catch (e) {
      throw e;
    }
  }
}

4. 处理错误和重试逻辑(可选)

tbib_dio_extension可能提供了一些内置的错误处理和重试逻辑,但具体实现取决于插件的版本和功能。如果需要自定义,你可以结合dio的拦截器来实现。

例如,添加一个简单的重试拦截器:

class RetryInterceptor extends Interceptor {
  @override
  Future onRequest(RequestOptions options) async {
    return options; // 你可以在这里修改请求选项
  }

  @override
  Future onResponse(Response response) async {
    return response; // 你可以在这里处理响应数据
  }

  @override
  Future onError(DioError err) async {
    // 判断错误类型,如果是可重试错误,则重试请求
    if (err.type == DioErrorType.CONNECT_TIMEOUT || err.type == DioErrorType.RECEIVE_TIMEOUT) {
      return err.requestOptions.retry(count: 2); // 最大重试次数为2
    } else {
      throw err; // 不可重试错误,抛出异常
    }
  }
}

// 在HttpClient类中注册拦截器
_dio.interceptors.add(RetryInterceptor());

以上代码展示了如何在Flutter项目中使用tbib_dio_extension插件进行网络请求。请确保查看插件的官方文档以获取最新的功能和API信息。

回到顶部