如何在Dart的getDocById泛型函数中将网络数据转为自定义类?
泛型函数中实现网络数据转指定类型的方案
在Dart中要实现泛型函数getDocById<T>把网络返回数据转为指定T类型,核心是让目标类型提供数据转换逻辑,再在泛型函数中调用该逻辑。以下是两种实用实现方式:
方式一:传入转换回调(推荐,扩展性强)
修改泛型函数,新增一个转换回调参数,让调用方传入对应类型的转换逻辑。这种方式符合开闭原则,新增类型无需修改泛型函数本身。
代码实现
import 'dart:convert'; import 'package:http/http.dart' as http; Future<T?> getDocById<T>(String id, T Function(Map<String, dynamic>) converter) async { // 1. 发起网络请求并解析JSON为Map final response = await http.get(Uri.parse('https://your-api-url/docs/$id')); if (response.statusCode != 200) return null; final Map<String, dynamic> data = jsonDecode(response.body); // 2. 用传入的转换器将Map转为T类型实例 return converter(data); } // 定义目标类型并提供转换逻辑 class User { String name; User(this.name); // 推荐定义fromJson构造函数,简化调用 User.fromJson(Map<String, dynamic> json) : name = json['name']; } class Boo { String prop; Boo(this.prop); Boo.fromJson(Map<String, dynamic> json) : prop = json['prop']; } // 调用示例 void main() async { // 方式A:直接传递匿名转换函数 final user1 = await getDocById<User>('user1', (map) => User(map['name'])); // 方式B:使用类的fromJson构造函数(更简洁) final user2 = await getDocById<User>('user2', User.fromJson); final boo = await getDocById<Boo>('boo1', Boo.fromJson); }
方式二:内部类型判断(适合固定类型场景)
如果你的业务中目标类型数量固定且很少,可以在泛型函数内部通过T == 类型的判断来对应转换。但这种方式扩展性差,新增类型必须修改泛型函数代码。
代码实现
import 'dart:convert'; import 'package:http/http.dart' as http; Future<T?> getDocById<T>(String id) async { final response = await http.get(Uri.parse('https://your-api-url/docs/$id')); if (response.statusCode != 200) return null; final Map<String, dynamic> data = jsonDecode(response.body); // 根据T的类型匹配转换逻辑 if (T == User) { return User(data['name']) as T; } else if (T == Boo) { return Boo(data['prop']) as T; } // 未匹配到类型时返回null或抛出异常 return null; } // 目标类型定义 class User { String name; User(this.name); } class Boo { String prop; Boo(this.prop); } // 调用示例 void main() async { final user = await getDocById<User>('user1'); final boo = await getDocById<Boo>('boo1'); }
内容的提问来源于stack exchange,提问作者Chinmoy kr
相关产品推荐
相关产品推荐

