Flutter实现Retrofit风格的网络请求封装

发布于:2025-07-27 ⋅ 阅读:(17) ⋅ 点赞:(0)

以下是一个基于 Android Retrofit 思路封装的 Flutter 网络请求框架示例。这个封装会借鉴 Retrofit 的设计模式,包括定义接口、使用注解、以及通过单例模式管理网络请求客户端。

1. 添加依赖

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

dependencies:
  dio: ^5.0.0
  retrofit: ^4.0.0
  json_annotation: ^4.8.0

2. 定义数据模型

使用 json_annotation 来定义数据模型,这类似于 Retrofit 中的 Gson 转换器。

import 'package:json_annotation/json_annotation.dart';

part 'user.g.dart';

()
class User {
   
   
  (name: 'id')
  int id;

  (name: 'name')
  String name;

  (name: 'email')
  String email;

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

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
}

3. 定义 API 接口

定义一个接口来描述网络请求,使用 Retrofit 的注解风格。

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

part 'api_service.g.dart';

()
abstract class ApiService {
   
   
  factory ApiService(Dio dio, {
   
   String baseUrl}) = _ApiService;

  ("/users/{id}")
  Future<User> getUser(("id") int userId);

  ("/users")
  Future<User> createUser(() User user);
}

4. 创建 Retrofit 实例

创建一个单例类来管理 Retrofit 实例,类似于 Retrofit 的初始化。

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

class RetrofitClient {
   
   
  static final RetrofitClient _instance = RetrofitClient._internal();
  late ApiService _apiService;

  factory RetrofitClient() {
   
   
    return _instance;
  }

  RetrofitClient._internal() {
   
   
    final dio = Dio(BaseOptions(baseUrl: "https://api.example.com/"));
    _apiService = ApiService(dio);
  }

  ApiService get apiService => _apiService;
}

5. 使用封装的网络请求

在你的 Flutter 应用中使用封装的网络请求。

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

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

class MyApp extends StatelessWidget {
   
   
  
  Widget build(BuildContext context) {
   
   
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Retrofit Example')),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
   
   
              try {
   
   
                var user = await RetrofitClient().apiService.getUser(1);
                print(user.name);
              } catch (e) {
   
   
                print(e);
              }
            },
            child: Text('Get User'),
          ),
        ),
      ),
    );
  }
}

6. 生成代码

由于使用了 retrofitjson_annotation,你需要运行以下命令来生成代码:

flutter pub run build_runner build

总结

通过以上步骤,你可以创建一个类似于 Retrofit 的网络请求框架。这个框架利用了 Retrofit 的注解和接口定义方式,同时结合了 Flutter 的 Dio 库来实现网络请求。这种方式不仅代码清晰,而且易于维护和扩展。

下面是一个优化后的 Flutter 网络请求框架,增加了环境切换功能,并进行了全面增强:

完整封装方案(带环境切换)

// network/dio_client.dart
import 'package:dio/dio.dart';
import 'package:logger/logger.dart';

class DioClient {
   
   
  static final DioClient _instance = DioClient._internal();
  late Dio _dio

网站公告

今日签到

点亮在社区的每一天
去签到