使用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
相关产品推荐
相关产品推荐

