Flutter网络通用处理插件generic_network的使用

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

Flutter网络通用处理插件generic_network的使用

特性

这是一个功能强大的Flutter HTTP网络包,旨在以最少的干净代码处理HTTP请求,并轻松处理错误。


开始使用

1. 创建API类

首先,我们需要创建一个继承自BaseApi的类。这个类用于定义基础URL。

class Api extends BaseApi {
  Api() : super(url: "https://your-base-url.com"); // 替换为你的实际基础URL
}

2. 定义请求目标

接下来,我们定义一个继承自TargetType的类,表示具体的HTTP请求。

class LoginRequest extends TargetType {
  final String email;
  final String password;

  LoginRequest({required this.password, required this.email}) {
    requestParameters = {"password": password, "email": email}; // 请求参数
  }

  [@override](/user/override)
  String? get path => "login"; // 替换为你的具体接口路径

  [@override](/user/override)
  HttpMethod? get method => HttpMethod.post; // HTTP方法,例如POST

  [@override](/user/override)
  Map<String, dynamic>? get headers => {}; // 额外的请求头

  [@override](/user/override)
  var requestParameters; // 请求参数
}

3. 定义响应模型

然后,我们定义一个继承自Decodable的类,表示服务器返回的JSON数据如何解析为对象。

class LoginResponse extends Decodable<LoginResponse> {
  String? userName;
  int? age;

  [@override](/user/override)
  LoginResponse fromJson(Map<String, dynamic> json) {
    return LoginResponse.fromJson(
      age: json["age"],
      userName: json["userName"],
    );
  }

  LoginResponse();

  LoginResponse.fromJson({required this.age, required this.userName});
}

4. 调用网络请求

最后,我们可以调用网络请求并处理结果。

void login() {
  Api().fetchData<LoginResponse, LoginResponse>(
    LoginRequest(email: "test@example.com", password: "password"),
    LoginResponse(),
  ).then((value) {
    // 处理成功或失败的结果
    if (value case Success(value: final value)) {
      print("登录成功: $value");
    } else if (value case Failure(exception: final exception)) {
      print("登录失败: $exception");
    }
  });
}

示例完整代码

以下是完整的示例代码,包括所有步骤:

import 'package:generic_network/generic_network.dart';

class Api extends BaseApi {
  Api() : super(url: "https://your-base-url.com"); // 替换为你的实际基础URL
}

class LoginRequest extends TargetType {
  final String email;
  final String password;

  LoginRequest({required this.password, required this.email}) {
    requestParameters = {"password": password, "email": email}; // 请求参数
  }

  [@override](/user/override)
  String? get path => "login"; // 替换为你的具体接口路径

  [@override](/user/override)
  HttpMethod? get method => HttpMethod.post; // HTTP方法,例如POST

  [@override](/user/override)
  Map<String, dynamic>? get headers => {}; // 额外的请求头

  [@override](/user/override)
  var requestParameters; // 请求参数
}

class LoginResponse extends Decodable<LoginResponse> {
  String? userName;
  int? age;

  [@override](/user/override)
  LoginResponse fromJson(Map<String, dynamic> json) {
    return LoginResponse.fromJson(
      age: json["age"],
      userName: json["userName"],
    );
  }

  LoginResponse();

  LoginResponse.fromJson({required this.age, required this.userName});
}

void login() {
  Api().fetchData<LoginResponse, LoginResponse>(
    LoginRequest(email: "test@example.com", password: "password"),
    LoginResponse(),
  ).then((value) {
    // 处理成功或失败的结果
    if (value case Success(value: final value)) {
      print("登录成功: $value");
    } else if (value case Failure(exception: final exception)) {
      print("登录失败: $exception");
    }
  });
}

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

1 回复

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


generic_network 是一个用于 Flutter 的网络请求处理插件,旨在简化网络请求的处理流程,提供统一的错误处理、请求拦截、响应解析等功能。它可以帮助开发者更高效地管理网络请求,减少重复代码。

以下是如何使用 generic_network 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  generic_network: ^1.0.0  # 请使用最新版本

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

2. 初始化网络客户端

在你的应用程序中,初始化 GenericNetwork 客户端。通常,你可以在 main.dart 或某个单独的配置文件中进行初始化。

import 'package:generic_network/generic_network.dart';

void main() {
  // 初始化网络客户端
  GenericNetwork.initialize(
    baseUrl: 'https://jsonplaceholder.typicode.com', // 基础URL
    interceptors: [
      LoggingInterceptor(), // 日志拦截器
      AuthInterceptor(),    // 认证拦截器
    ],
    errorHandler: (error) {
      // 全局错误处理
      print('Network Error: $error');
    },
  );

  runApp(MyApp());
}

3. 发起网络请求

你可以使用 GenericNetwork 提供的 getpostputdelete 等方法来发起网络请求。

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Generic Network Example'),
        ),
        body: Center(
          child: FutureBuilder<Map<String, dynamic>>(
            future: fetchData(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.waiting) {
                return CircularProgressIndicator();
              } else if (snapshot.hasError) {
                return Text('Error: ${snapshot.error}');
              } else {
                return Text('Response: ${snapshot.data}');
              }
            },
          ),
        ),
      ),
    );
  }

  Future<Map<String, dynamic>> fetchData() async {
    final response = await GenericNetwork.get('/posts/1');
    return response.data;
  }
}

4. 使用拦截器

generic_network 支持拦截器,你可以在请求发送前或响应返回后进行一些处理。例如,你可以添加一个日志拦截器来记录所有请求和响应。

class LoggingInterceptor extends Interceptor {
  @override
  void onRequest(RequestOptions options) {
    print('Request: ${options.method} ${options.path}');
    super.onRequest(options);
  }

  @override
  void onResponse(Response response) {
    print('Response: ${response.statusCode} ${response.data}');
    super.onResponse(response);
  }

  @override
  void onError(GenericNetworkError error) {
    print('Error: ${error.message}');
    super.onError(error);
  }
}

5. 全局错误处理

你可以在初始化时设置全局错误处理函数,以便在发生网络错误时进行统一处理。

GenericNetwork.initialize(
  baseUrl: 'https://jsonplaceholder.typicode.com',
  errorHandler: (error) {
    print('Global Error: $error');
    // 你可以在这里进行错误处理,例如显示一个错误提示
  },
);

6. 处理响应数据

generic_network 返回的响应数据是一个 Response 对象,你可以通过 response.data 获取解析后的数据。

final response = await GenericNetwork.get('/posts/1');
final post = response.data; // 假设返回的是一个 Map<String, dynamic>

7. 其他功能

generic_network 还支持:

  • 请求头设置:你可以在请求中添加自定义的请求头。
  • 请求超时设置:可以设置请求的超时时间。
  • 请求取消:支持取消正在进行的请求。
final response = await GenericNetwork.get(
  '/posts/1',
  headers: {'Authorization': 'Bearer token'},
  timeout: Duration(seconds: 10),
);
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!