Flutter网络请求增强插件embrace_dio的使用

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

Flutter网络请求增强插件embrace_dio的使用

embrace_dio 是一个用于捕获通过 Dio 包发起的网络请求的插件。它可以帮助你更好地管理和监控你的网络请求。

使用

要使用 embrace_dio,你需要将 EmbraceInterceptor 添加到 Dio 实例中。

var dio = Dio();
dio.interceptors.add(EmbraceInterceptor());

下面是一个完整的示例代码,展示如何在 Flutter 应用中使用 embrace_dio 来发送和记录网络请求。

// ignore_for_file: inference_failure_on_function_invocation

import 'package:dio/dio.dart';
import 'package:embrace/embrace.dart';
import 'package:embrace_dio/embrace_dio.dart';
import 'package:flutter/material.dart';

Future<void> main() async {
  // 启动 Embrace 并运行应用
  await Embrace.instance.start(() => runApp(const EmbraceDioDemo()));
}

class EmbraceDioDemo extends StatelessWidget {
  const EmbraceDioDemo({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(home: EmbraceDioMenu());
  }
}

class EmbraceDioMenu extends StatefulWidget {
  const EmbraceDioMenu({Key? key}) : super(key: key);

  [@override](/user/override)
  State<EmbraceDioMenu> createState() => _EmbraceDioMenuState();
}

class _EmbraceDioMenuState extends State<EmbraceDioMenu> {
  late final _dio = Dio(); // 创建 Dio 实例

  [@override](/user/override)
  void initState() {
    super.initState();
    _dio.interceptors.add(EmbraceInterceptor()); // 将 EmbraceInterceptor 添加到 Dio 实例
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('网络请求')),
      body: Padding(
        padding: const EdgeInsets.all(8),
        child: Center(
          child: Column(
            children: [
              ElevatedButton(
                onPressed: () => sendAndLogRequest(HttpMethod.get), // 点击时调用 sendAndLogRequest 方法
                child: const Text('GET 请求'),
              ),
              ElevatedButton(
                onPressed: () => sendAndLogRequest(HttpMethod.post), // 点击时调用 sendAndLogRequest 方法
                child: const Text('POST 请求'),
              ),
              ElevatedButton(
                onPressed: () => sendAndLogRequest(HttpMethod.put), // 点击时调用 sendAndLogRequest 方法
                child: const Text('PUT 请求'),
              ),
              ElevatedButton(
                onPressed: () => sendAndLogRequest(HttpMethod.patch), // 点击时调用 sendAndLogRequest 方法
                child: const Text('PATCH 请求'),
              ),
              ElevatedButton(
                onPressed: () => sendAndLogRequest(HttpMethod.delete), // 点击时调用 sendAndLogRequest 方法
                child: const Text('DELETE 请求'),
              ),
              ElevatedButton(
                onPressed: error404Request, // 点击时调用 error404Request 方法
                child: const Text('错误: 404'),
              ),
              ElevatedButton(
                onPressed: invalidDomainRequest, // 点击时调用 invalidDomainRequest 方法
                child: const Text('错误: 无效域名'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    _dio.close(); // 关闭 Dio 实例
    super.dispose();
  }

  // 发送请求并记录日志
  Future<void> sendAndLogRequest(HttpMethod method) async {
    switch (method) {
      case HttpMethod.put:
        await _dio.put('https://httpbin.org/put'); // 发送 PUT 请求
        break;
      case HttpMethod.post:
        await _dio.post('https://httpbin.org/post'); // 发送 POST 请求
        break;
      case HttpMethod.patch:
        await _dio.patch('https://httpbin.org/patch'); // 发送 PATCH 请求
        break;
      case HttpMethod.delete:
        await _dio.delete('https://httpbin.org/delete'); // 发送 DELETE 请求
        break;
      case HttpMethod.get:
        await _dio.get('https://httpbin.org/get'); // 发送 GET 请求
        break;
      case HttpMethod.other:
        await _dio.get('https://httpbin.org/get'); // 发送其他类型的请求
        break;
    }
  }

  // 发送 404 错误请求
  Future<void> error404Request() async {
    await _dio.get('https://httpbin.org/status/404'); // 发送返回 404 的请求
  }

  // 发送无效域名请求
  Future<void> invalidDomainRequest() async {
    await _dio.get('https://httpbin.invalid'); // 发送无效域名的请求
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用embrace_dio插件来进行网络请求的示例代码。embrace_dio是一个增强版的DIO库,提供了更强大的网络请求功能以及更好的错误处理和日志记录能力。

首先,确保你已经在pubspec.yaml文件中添加了embrace_dio依赖:

dependencies:
  flutter:
    sdk: flutter
  embrace_dio: ^最新版本号 # 请替换为实际的最新版本号

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

接下来,在你的Flutter项目中创建一个服务类来使用embrace_dio进行网络请求。以下是一个示例代码:

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

class ApiService {
  final EmbraceDio _dio;

  ApiService() : _dio = EmbraceDio(
    BaseOptions(
      baseUrl: 'https://api.example.com', // 替换为你的API基础URL
    ),
    interceptor: [
      // 可以添加自定义拦截器,例如日志拦截器
      EmbraceLogInterceptor(
        requestHeader: true,
        requestBody: true,
        responseBody: true,
        responseHeader: false,
        printLevel: EmbraceLogPrintLevel.all,
      ),
      // 可以添加其他拦截器,例如错误处理拦截器
      EmbraceErrorInterceptor(onError: (context, err, stackTrace) {
        // 自定义错误处理逻辑
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('请求失败: ${err.message}')),
        );
      }),
    ],
  );

  // 示例GET请求
  Future<Map<String, dynamic>> getExampleData() async {
    try {
      Response<Map<String, dynamic>> response = await _dio.get('/example-endpoint');
      return response.data;
    } catch (e) {
      throw e; // 重新抛出异常以便上层处理
    }
  }

  // 示例POST请求
  Future<Map<String, dynamic>> postExampleData({required Map<String, dynamic> data}) async {
    try {
      Response<Map<String, dynamic>> response = await _dio.post('/example-endpoint', data: data);
      return response.data;
    } catch (e) {
      throw e; // 重新抛出异常以便上层处理
    }
  }
}

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('EmbraceDio Demo')),
        body: Center(
          child: MyHomePage(),
        ),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final ApiService _apiService = ApiService();
  late Future<Map<String, dynamic>> _futureData;

  @override
  void initState() {
    super.initState();
    _futureData = _fetchData();
  }

  Future<Map<String, dynamic>> _fetchData() async {
    try {
      return await _apiService.getExampleData();
    } catch (e) {
      // 处理错误
      return {};
    }
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<Map<String, dynamic>>(
      future: _futureData,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          if (snapshot.hasError) {
            return Text('Error: ${snapshot.error}');
          } else {
            Map<String, dynamic> data = snapshot.data ?? {};
            return ListView.builder(
              itemCount: data.length,
              itemBuilder: (context, index) {
                Map.Entry<String, dynamic> entry = data.entries.elementAt(index);
                return ListTile(
                  title: Text('${entry.key}: ${entry.value}'),
                );
              },
            );
          }
        } else {
          return CircularProgressIndicator();
        }
      },
    );
  }
}

在这个示例中,我们创建了一个ApiService类来封装所有的网络请求。我们使用了EmbraceDio来初始化DIO客户端,并添加了一些拦截器来处理日志记录和错误处理。然后,我们在MyHomePage中展示了如何使用这个服务类来发起网络请求并显示结果。

请根据你的实际需求调整API的基础URL、请求路径和请求参数。

回到顶部