You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 20:40:43