Flutter中如何实现ApiResponse<T>的封装和使用

在Flutter开发中,我想封装一个通用的ApiResponse<T>类来处理网络请求的响应,但不太清楚如何实现类型安全的数据解析。目前遇到几个问题:

  1. 如何定义基类才能兼容不同数据模型?
  2. 如何处理成功/错误状态码和业务数据?
  3. 使用泛型时怎样避免运行时类型擦除问题?
  4. 是否有必要将JSON序列化逻辑封装在ApiResponse内部?
    希望能看到具体代码示例和最佳实践方案。
2 回复

在Flutter中,使用泛型封装ApiResponse类:

class ApiResponse<T> {
  final T? data;
  final String? error;
  final bool success;

  ApiResponse.success(this.data) 
    : success = true, error = null;
    
  ApiResponse.error(this.error) 
    : success = false, data = null;
}

使用:

ApiResponse<User> response = await api.getUser();
if (response.success) {
  print(response.data!.name);
} else {
  print(response.error);
}

更多关于Flutter中如何实现ApiResponse<T>的封装和使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,可以通过泛型类封装ApiResponse,统一处理API响应状态(成功、加载中、错误),便于状态管理和UI更新。

1. 定义ApiResponse类

class ApiResponse<T> {
  Status status;
  T? data;
  String? message;

  ApiResponse.initial() : status = Status.initial;
  ApiResponse.loading() : status = Status.loading;
  ApiResponse.success(this.data) : status = Status.success;
  ApiResponse.error(this.message) : status = Status.error;

  @override
  String toString() {
    return "Status: $status \n Message: $message \n Data: $data";
  }
}

enum Status { initial, loading, success, error }

2. 在ViewModel/Bloc中使用

class UserViewModel extends ChangeNotifier {
  ApiResponse<List<User>> usersResponse = ApiResponse.initial();

  Future<void> fetchUsers() async {
    usersResponse = ApiResponse.loading();
    notifyListeners();

    try {
      final users = await ApiService.getUsers();
      usersResponse = ApiResponse.success(users);
    } catch (e) {
      usersResponse = ApiResponse.error(e.toString());
    }
    notifyListeners();
  }
}

3. 在UI中根据状态显示

Consumer<UserViewModel>(
  builder: (context, viewModel, child) {
    switch (viewModel.usersResponse.status) {
      case Status.initial:
        return Placeholder();
      case Status.loading:
        return CircularProgressIndicator();
      case Status.success:
        return ListView.builder(
          itemCount: viewModel.usersResponse.data!.length,
          itemBuilder: (context, index) => 
            Text(viewModel.usersResponse.data![index].name),
        );
      case Status.error:
        return Text(viewModel.usersResponse.message!);
    }
  },
)

优势:

  • 类型安全(泛型)
  • 状态集中管理
  • UI响应式更新
  • 易于扩展和维护

可根据实际需求添加更多状态(如空数据、网络异常等)。

回到顶部