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

使用chat_gpt_sdk时String突然为空?Flutter开发问题排查

问题分析与解决

问题重现

尝试使用chat_gpt_sdk Flutter包获取线程消息时,创建Run后调用listRunSteps出现空类型转换错误,代码片段如下:

final runRequest = CreateRun(assistantId: assistantID);
runResult = await globals.chatAI.threads.runs
    .createRun(threadId: threadID, request: runRequest);

var runID = runResult.id.toString();
print('runID: $runID');
// 输出为 'runID: run_abc123'

final mRunSteps = await globals.chatAI.threads.runs.listRunSteps(
  threadId: threadID,
  runId: runID, // 此处报错!
);

print('runID after: ${runResult.id}');

运行时错误日志:

[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: type 'Null' is not a subtype of type 'String'
#0      new ListRun.fromJson (package:chat_gpt_sdk/src/model/run/response/list_run.dart:19:22)
#1      OpenAIClient.get (package:chat_gpt_sdk/src/client/openai_client.dart:59:25)
<asynchronous suspension>
#2      ChatBotBrain.getChatAnswer (package:germaniac01/controlers/chatbot_brain.dart:84:23)
<asynchronous suspension>
#3      _ChatBotScreenState.build.<anonymous closure>.<anonymous closure> (package:germaniac01/screens/chatbot_screen.dart:52:35)
<asynchronous suspension>

核心原因

错误并非来自runID本身——从日志和打印结果看runID确实是有效字符串。问题出在刚创建的Run还未完成,调用listRunSteps时接口返回的JSON数据中,ListRun模型的某个必填字段为null,导致SDK解析JSON时抛出类型转换错误。

硬编码runID能成功,是因为对应的Run已经处于completed状态,接口返回的JSON结构完整,所有必填字段都有有效值,不会触发解析错误。

解决步骤

1. 等待Run完成后再调用listRunSteps

Run创建后不会立即完成,需要轮询其状态,直到状态变为completed再执行后续操作:

final runRequest = CreateRun(assistantId: assistantID);
runResult = await globals.chatAI.threads.runs
    .createRun(threadId: threadID, request: runRequest);

var runID = runResult.id.toString();
print('runID: $runID');

// 轮询Run状态,直到完成
while (true) {
  final currentRun = await globals.chatAI.threads.runs.getRun(
    threadId: threadID,
    runId: runID,
  );
  if (currentRun.status == RunStatus.completed) {
    break;
  }
  // 间隔1秒再查询,避免频繁请求
  await Future.delayed(const Duration(seconds: 1));
}

// 此时调用listRunSteps即可正常解析
final mRunSteps = await globals.chatAI.threads.runs.listRunSteps(
  threadId: threadID,
  runId: runID,
);

2. 检查SDK版本或自定义解析

如果轮询后仍报错,可能是SDK的ListRun模型存在字段非空断言问题:

  • 查看list_run.dart第19行对应的字段,确认接口返回的该字段是否允许为null;
  • 尝试升级chat_gpt_sdk到最新版本,看是否修复了该解析问题;
  • 若SDK未修复,可手动封装请求,自定义JSON解析逻辑处理null字段。

3. 增加非空校验(可选)

为确保runID的有效性,可添加断言或非空检查:

assert(runID.isNotEmpty, "runID不能为空且非空字符串");
// 或
if (runID.isEmpty) {
  throw Exception("无效的runID");
}

内容的提问来源于stack exchange,提问作者biodegradablePotatoChip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 19:52:48