Flutter中如何实现ApiResponse<T>的封装和使用
在Flutter开发中,我想封装一个通用的ApiResponse<T>类来处理网络请求的响应,但不太清楚如何实现类型安全的数据解析。目前遇到几个问题:
- 如何定义基类才能兼容不同数据模型?
- 如何处理成功/错误状态码和业务数据?
- 使用泛型时怎样避免运行时类型擦除问题?
- 是否有必要将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响应式更新
- 易于扩展和维护
可根据实际需求添加更多状态(如空数据、网络异常等)。

