Flutter网络请求插件playx_network的使用

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

Flutter网络请求插件playx_network的使用

Playx Network 插件介绍

Playx Network 是一个包装在 Dio 之上的插件,用于执行 API 请求。它提供了更好的错误处理,并且可以轻松获取任何 API 请求的结果。

  • 支持 GET, POST, PUT 和 DELETE HTTP 方法。
  • 提供了更好的错误处理机制,可以根据需要自定义这些错误。
  • 每个请求都由 NetworkResult 返回,表示 API 请求的成功或失败。
  • 不再需要使用 try-catch,因为每个请求都会被处理。
  • 网络调用以清晰、易于阅读的格式进行日志记录。

安装 Playx Network

pubspec.yaml 中添加以下依赖项:

playx_network: ^0.2.0

使用 Playx Network

我们可以使用 PlayxNetworkClient 来执行 GET, POST, PUT 和 DELETE HTTP 方法。

  1. 设置 PlayxNetworkClient 并根据需求配置它

    • 根据您的需求创建一个 PlayxNetworkClient 实例。 通常情况下,您只需要创建一个实例来满足整个应用的需求。
    final PlayxNetworkClient _client = PlayxNetworkClient(
      dio: Dio(
        BaseOptions(
          baseUrl: 'https://api.example.com', // 替换为实际的基 URL
          connectTimeout: const Duration(seconds: 20),
          sendTimeout: const Duration(seconds: 20),
        ),
      ),
      customHeaders: () async {
        return {'authorization': 'Bearer token'}; // 添加自定义头部
      },
      errorMapper: (json) {
        if (json.containsKey('message')) {
          return json['message'] as String?;
        }
        return null;
      },
    );
    
  2. 使用客户端执行任何 GET, POST, PUT 和 DELETE HTTP 方法

    例如,我们将执行一个 GET 请求来获取猫的列表,使用此 API:

    https://api.thecatapi.com/v1/images/search?limit=10
    
    1. 首先创建一个模型类来处理从 API 返回的数据。该类应包含一个从 JSON 函数,该函数将动态 JSON 转换为模型。
    class Cat {
      String? id;
      String? url;
      num? width;
      num? height;
    
      Cat({
        this.id,
        this.url,
        this.width,
        this.height,
      });
    
      Cat.fromJson(dynamic json) {
        id = json['id'];
        url = json['url'];
        width = json['width'];
        height = json['height'];
      }
    
      Map<String, dynamic> toJson() {
        final map = <String, dynamic>{};
        map['id'] = id;
        map['url'] = url;
        map['width'] = width;
        map['height'] = height;
        return map;
      }
    }
    
    1. 执行 GET 请求:
    final result = await _client.getList(
      'https://api.thecatapi.com/v1/images/search?limit=10',
      query: {},
      fromJson: Cat.fromJson,
    );
    
    1. 处理请求结果:
    result.when(success: (cats) {
      // 处理成功情况,这里返回猫的列表。
    }, error: (error) {
      // 处理错误情况并显示错误消息。
      print("Error is : ${error.message}");
    });
    

可用的方法

以下是 PlayxNetworkClient 的提供的所有方法:

Method Description
get 发送 GET 请求到给定的 URL 并返回 Type [T] 模型的 NetworkResult
getList 发送 GET 请求到给定的 URL 并返回 List of Type [T] 模型的 NetworkResult
post 发送 POST 请求到给定的 URL 并返回 Type [T] 模型的 NetworkResult
postList 发送 POST 请求到给定的 URL 并返回 List of Type [T] 模型的 NetworkResult
put 发送 PUT 请求到给定的 URL 并返回 Type [T] 模型的 NetworkResult
putList 发送 PUT 请求到给定的 URL 并返回 List of Type [T] 模型的 NetworkResult
delete 发送 DELETE 请求到给定的 URL 并返回 Type [T] 模型的 NetworkResult
deleteList 发送 DELETE 请求到给定的 URL 并返回 List of Type [T] 模型的 NetworkResult

错误消息定制

您可以自定义错误消息,使用自己的消息。

  1. 创建一个继承自 ExceptionMessage 的类,并覆盖所有消息,如下所示:

    class CustomExceptionMessage extends ExceptionMessage {
      const CustomExceptionMessage();
    
      @override
      String get badRequest => "Sorry, The API request is invalid or improperly formed.";
    
      @override
      String get conflict => "Sorry, The request wasn't completed due to a conflict.";
    
      @override
      String get defaultError => "Sorry, Something went wrong.";
    
      @override
      String get emptyResponse => "Sorry, Couldn't receive response from the server.";
    
      @override
      String get formatException => "Sorry, The request wasn't formatted correctly.";
    
      @override
      String get internalServerError => "Sorry, There is an internal server error";
    
      @override
      String get noInternetConnection => "Sorry, There is no internet connection.";
    
      @override
      String get notAcceptable => "Sorry, The request is not acceptable";
    
      @override
      String get notFound => "Sorry, The resource requested couldn't be found.";
    
      @override
      String get requestCancelled => "Sorry, The request has been canceled";
    
      @override
      String get requestTimeout => "Sorry, The request has timed out.";
    
      @override
      String get sendTimeout => "Sorry, The request has send timeout in connection with API server";
    
      @override
      String get serviceUnavailable => "Sorry, The service is unavailable";
    
      @override
      String get unableToProcess => "Sorry, Couldn't process the data.";
    
      @override
      String get unauthorizedRequest => "Sorry, The request is unauthorized.";
    
      @override
      String get unexpectedError => "Sorry, Something went wrong.";
    }
    
  2. 配置 PlayxNetworkClient 使用您创建的 CustomExceptionMessage

    final PlayxNetworkClient _client = PlayxNetworkClient(
      exceptionMessages: const CustomExceptionMessage(),
    );
    

映射网络结果

获取 API 结果后,我们可以很容易地将其映射到我们想要的任何类型。

  1. 示例:将猫的列表映射到图片 URL 列表。

    final NetworkResult<List<String?>> catImagesResult = result.map(
      success: (success) {
        final data = success.data;
        final imagesUrls = data.map((e) => e.url).toList();
        return NetworkResult.success(imageUrls);
      },
      error: (error) {
        return NetworkResult<List<String?>>.error(error.error);
      },
    );
    
  2. 同样,也可以异步映射结果:

    final NetworkResult<List<String?>> catImagesAsyncResult = await result.mapAsync(
      success: (success) async {
        final data = success.data;
        final imageUrls = data.map((e) => e.url).toList();
        return NetworkResult.success(imageUrls);
      },
      error: (error) async {
        return NetworkResult<List<String?>>.error(error.error);
      },
    );
    

日志记录

该包使用 pretty_dio_logger 包来记录 Dio 请求。

如何查看

VS Code:

Android Studio:

您可以自定义打印的内容或是否启用日志记录,如下所示:

final PlayxNetworkClient _client = PlayxNetworkClient(
  attachLoggerOnDebug: true,
  logSettings: const LoggerSettings(
    responseBody: true,
    request: true,
    requestHeader: true,
    requestBody: true,
    responseHeader: false,
    error: true,
    maxWidth: 90,
    compact: true,
  ),
);

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

1 回复

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


当然,下面是一个关于如何使用 playx_network 插件在 Flutter 中进行网络请求的示例代码。这个插件可以帮助你简化网络请求的处理。

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

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

然后运行 flutter pub get 来获取依赖。

接下来,你可以按照以下步骤使用 playx_network 进行网络请求:

  1. 配置 PlayxNetwork

    在你的应用入口文件(通常是 main.dart)中配置 PlayxNetwork

import 'package:flutter/material.dart';
import 'package:playx_network/playx_network.dart';

void main() {
  // 配置 PlayxNetwork
  PlayxNetwork.instance.configure(
    baseUrl: 'https://api.example.com', // 你的API基础URL
    headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json',
      // 可以添加更多的全局header
    },
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}
  1. 创建一个数据模型

    假设你的API返回的数据是一个用户对象,你可以创建一个数据模型来解析这个JSON。

import 'package:json_annotation/json_annotation.dart';

part 'user_model.g.dart';

@JsonSerializable()
class UserModel {
  final String name;
  final int age;

  UserModel({required this.name, required this.age});

  factory UserModel.fromJson(Map<String, dynamic> json) => _$UserModelFromJson(json);
  Map<String, dynamic> toJson() => _$UserModelToJson(this);
}

生成 user_model.g.dart 文件:

flutter pub run build_runner build
  1. 进行网络请求

    在你的界面组件中进行网络请求。

import 'package:flutter/material.dart';
import 'package:playx_network/playx_network.dart';
import 'user_model.dart';

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  UserModel? user;
  String errorMessage = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('PlayxNetwork Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            if (errorMessage.isNotEmpty)
              Text(
                errorMessage,
                style: TextStyle(color: Colors.red),
              ),
            if (user != null)
              Column(
                children: [
                  Text('Name: ${user!.name}'),
                  Text('Age: ${user!.age}'),
                ],
              ),
            ElevatedButton(
              onPressed: fetchUserData,
              child: Text('Fetch User Data'),
            ),
          ],
        ),
      ),
    );
  }

  void fetchUserData() async {
    setState(() {
      errorMessage = '';
      user = null;
    });

    try {
      final response = await PlayxNetwork.instance.get<Map<String, dynamic>>(
        'endpoint/to/fetch/user', // 替换为你的API端点
      );

      if (response.success) {
        final userJson = response.data!;
        final userModel = UserModel.fromJson(userJson);
        setState(() {
          user = userModel;
        });
      } else {
        setState(() {
          errorMessage = response.message ?? 'Failed to fetch data';
        });
      }
    } catch (e) {
      setState(() {
        errorMessage = e.toString();
      });
    }
  }
}

在这个示例中,我们配置了 PlayxNetwork,创建了一个数据模型 UserModel,并在 HomeScreen 中进行了一个简单的 GET 请求。如果请求成功,我们将解析 JSON 数据并更新界面;如果请求失败,我们将显示错误信息。

你可以根据需要扩展这个示例,例如添加 POST 请求、处理更多复杂的数据结构、或者添加错误重试逻辑等。

回到顶部