connect method
建立 SSE 连接并管理
id 连接唯一标识符(用于管理多个连接)
path 请求路径
method HTTP 方法,默认为 'GET'
data 请求体数据(POST 请求时使用)
queryParameters URL 查询参数
headers 特定请求的请求头(可选),会与全局请求头合并,如果键相同则覆盖全局请求头
baseUrl 直接指定 baseUrl(最高优先级)
service 使用 serviceBaseUrls 中定义的服务名称
onData 数据回调
onError 错误回调(可选)
onDone 完成回调(可选)
replaceIfExists 如果连接已存在,是否替换(默认 true)
返回连接 ID
示例:
final manager = http.sseManager();
// 建立第一个连接(使用默认 baseUrl)
await manager.connect(
id: 'chat',
path: '/ai/chat/stream',
method: 'POST',
data: {'question': '你好'},
headers: {'X-Custom-Header': 'value'}, // 特定请求头
onData: (event) => print('聊天: ${event.data}'),
);
// 建立第二个连接(使用服务)
await manager.connect(
id: 'notifications',
path: '/notifications/stream',
service: 'files', // 使用 files 服务
onData: (event) => print('通知: ${event.data}'),
);
Implementation
Future<String> connect({
required String id,
required String path,
String method = 'GET',
dynamic data,
Map<String, String>? queryParameters,
Map<String, String>? headers,
String? baseUrl,
String? service,
required void Function(SSEEvent event) onData,
void Function(Object error)? onError,
void Function()? onDone,
bool replaceIfExists = true,
}) async {
// 如果连接已存在
if (_connections.containsKey(id)) {
if (replaceIfExists) {
// 断开旧连接
await disconnect(id);
} else {
// 不替换,直接返回
return id;
}
}
// 为连接创建 Completer(用于跟踪完成状态)
// 必须在连接建立前创建,这样即使连接在 waitForAllConnectionsDone() 调用前完成也能正确跟踪
if (!_connectionCompleters.containsKey(id)) {
_connectionCompleters[id] = Completer<void>();
}
// 子类需要实现此方法
throw UnimplementedError('请使用 http.sseManager() 创建管理器');
}