Flutter API模型管理插件flutter_api_model的使用

Flutter API模型管理插件flutter_api_model的使用

特性

高阶网络请求建模,管理输入参数和输出参数,遵循"In-Out"命名规范。APIModel不直接处理网络请求;相反,它擅长于网络层抽象。

开始使用

安装

在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter_api_model: latest_version

导入

将包导入到Dart代码中:

import 'package:flutter_api_model/flutter_api_model.dart';

支持await和回调格式以增加灵活性

使用await

final model = await UserSearchAPIModel(inUserId: '2024').start();
if (model.hasError) {
  error = model.outError;
} else {
  user = model.outUser;
}

使用回调

UserSearchAPIModel(inUserId: '2024').onComplete((model) {
  if (!model.hasError) {
    user = model.outUser;
  } else {
    error = model.outError;
  }
}).start();

类定义

命名规则

  • 输入参数前缀:in
    • (inUserId, inPassword)
  • 输出结果前缀:out
    • (outUser)

定义APIModel的三种方式

  1. 使用mixin 适用于没有特殊初始化需求的场景。

    class SomeAPIModel with APIModel<SomeAPIModel>
    
  2. 使用继承 适合定义一个扩展APIModel的基本网络请求类。

    class BaseRequestModel extends APIModel<SomeAPIModel>
    
  3. 使用mixin和继承的组合(推荐) 最适合自定义网络请求、数据处理和职责分离。例如,BaseRequest可以处理Dio操作和数据转换,而APIModel则提供请求流程和封装。

    class SomeAPIModel extends BaseRequest with APIModel<SomeAPIModel>
    

示例:定义UserSearchAPIModel

class UserSearchAPIModel extends BaseRequest<Map> 
      with  APIModel<UserSearchAPIModel>, 
            OutError<UserSearchAPIModel, FlutterError>,
            LoginNeed,
            CancelEnable {
  UserSearchAPIModel({required this.inUserId});
  /// 输入参数
  String inUserId;
  /// 输出结果
  User? outUser;

  [@override](/user/override)
  load() async {
    try {
      final response = await dio.request('/user/profile', cancelToken: cancelToken);
      outUser = User.converFrom(jsonObject);
    } on FlutterError catch (e) {
        outError = e;
    } catch (e) {
      if (CancelToken.isCancel(e) == false) { 
        // 处理错误
        throw e;
      }
    } finally {
      finalize();
    }
  }

}

/// 如果需要初始化工作,定义基础类型
/// 定义 `BaseRequest` 类
class BaseRequest<DataType> {
  final dio = Dio();

  final cancelToken = CancelToken(); 

  DataType? data;

  int? code;

  String? msg;

  BaseRequest() {
    dio.options.baseUrl = 'https://base_url.com';
    dio.options.headers = {'token': 'some_token'};
  }

  void fillData(Dio.Response response) {
    data = getData(response);
    code = response.statusCode;
    msg  = getMsg(response);
  }
}

/// 定义一个mixin来覆盖 `hasPermission` 方法,当用户未登录时阻止调用。
/// 定义 `LoginNeed` Mixin.
mixin LoginNeed<T> on APIModel<T> {

  [@override](/user/override)
  bool hasPermission() {
    return isLogin();
  }

  didBlock() {
    print('API 请求被阻塞。');
  }
}

/// 使用 `CancelEnable` Mixin 实现可取消的请求
[@optionalTypeArgs](/user/optionalTypeArgs)
mixin CancelEnable<T> on APIModel<T>, BaseRequest {

  [@override](/user/override)
  bool isCancellable() {
    return true;
  }

  [@override](/user/override)
  void cancel() {
    super.cancel();
    cancelToken.cancel();
  }
}

更多关于Flutter API模型管理插件flutter_api_model的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter API模型管理插件flutter_api_model的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_api_model 是一个用于管理 API 数据模型的 Flutter 插件,它可以帮助开发者快速生成和管理与 API 相关的数据模型类。通过这个插件,开发者可以更轻松地将 JSON 数据转换为 Dart 对象,并在应用中进行使用。

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

1. 安装插件

首先,你需要在 pubspec.yaml 文件中添加 flutter_api_model 插件的依赖:

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

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

2. 生成模型类

flutter_api_model 提供了一个命令行工具来生成模型类。你可以通过以下步骤生成模型:

2.1 创建一个 JSON 文件

首先,你需要有一个描述你的 API 数据的 JSON 文件。例如,假设你有一个 user.json 文件,内容如下:

{
  "id": 1,
  "name": "John Doe",
  "email": "john.doe@example.com",
  "is_active": true
}

2.2 使用命令行工具生成模型类

在终端中运行以下命令来生成模型类:

flutter pub run flutter_api_model generate -i path/to/user.json -o lib/models/
  • -i 参数指定输入 JSON 文件的路径。
  • -o 参数指定生成的 Dart 文件的输出目录。

运行命令后,插件会根据 JSON 文件生成相应的 Dart 模型类。例如,它会生成一个 user.dart 文件:

import 'package:flutter_api_model/flutter_api_model.dart';

class User with ApiModel {
  int id;
  String name;
  String email;
  bool isActive;

  User({
    required this.id,
    required this.name,
    required this.email,
    required this.isActive,
  });

  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      id: json['id'],
      name: json['name'],
      email: json['email'],
      isActive: json['is_active'],
    );
  }

  @override
  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'name': name,
      'email': email,
      'is_active': isActive,
    };
  }
}

3. 使用生成的模型类

生成模型类后,你可以在应用中使用它们来解析和序列化 JSON 数据。例如:

import 'package:flutter/material.dart';
import 'models/user.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 假设你从 API 获取了以下 JSON 数据
    final jsonData = {
      "id": 1,
      "name": "John Doe",
      "email": "john.doe@example.com",
      "is_active": true
    };

    // 将 JSON 数据转换为 User 对象
    final user = User.fromJson(jsonData);

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('User Profile'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Name: ${user.name}'),
              Text('Email: ${user.email}'),
              Text('Active: ${user.isActive}'),
            ],
          ),
        ),
      ),
    );
  }
}

4. 自定义生成的模型类

flutter_api_model 允许你通过配置文件自定义生成的模型类。你可以在项目根目录下创建一个 flutter_api_model.yaml 文件,并在其中指定自定义选项。例如:

generate:
  model_suffix: Model
  json_serializable: true
回到顶部