Flutter解析Dialogflow fulfillmentMessages异常问题咨询
Flutter对接Dialogflow时fulfillmentMessages解析异常问题
配置说明
- DEFAULT(默认)响应中配置了一个简单的custom_payload,控制台配置截图如下:

- Facebook集成响应配置为一组quick_replies(快速回复),配置截图如下:

下载对应Intent可查看两类响应的JSON结构如下:
"messages": [ { "type": "quick_reply", "platform": "facebook", "condition": "", "title": "What can I help you with today?", "replies": [ "Facebook option 1", "Facebook option 2" ] }, { "type": "custom_payload", "condition": "", "payload": { "replies": [ "option 1", "option 2" ], "text": "this is some text!" } } ],
测试逻辑
在Flutter测试应用中对接Dialogflow,发送匹配上述Intent的查询请求。由于detectIntent()返回的fulfillmentMessages为List类型,代码中会打印该列表长度,以及列表中每个Message的键值对,测试代码如下:
var request = Dialogflow.getRequestTextInput(query, "en-US"); var response = await df.detectIntent(request, sessionPath); List<GoogleCloudDialogflowV2IntentMessage> payloads = response.queryResult.fulfillmentMessages; debugPrint("Got response length: ${payloads.length}"); debugPrint(response.toString()); GoogleCloudDialogflowV2IntentMessage firstEntry = payloads[0]; Map<String, dynamic> payload0 = firstEntry.payload; payload0.forEach((key, value) => debugPrint("Key: $key Value: $value")); debugPrint("Printing second entry"); GoogleCloudDialogflowV2IntentMessage secondEntry = payloads[1]; Map<String, dynamic> payload1 = secondEntry.payload; payload1.forEach((key, value) => debugPrint("Key: $key Value: $value")); debugPrint("Printing third entry"); GoogleCloudDialogflowV2IntentMessage thirdEntry = payloads[2]; Map<String, dynamic> payload2 = thirdEntry.payload; payload2.forEach((key, value) => debugPrint("Key: $key Value: $value"));
测试场景与现象
场景1:开启「优先使用Default标签页响应」滑块开关
观测现象:
- 返回的
fulfillmentMessages列表长度为3 - 打印列表第0项:可正常输出custom_payload的键值对
- 打印列表第1项:程序抛出未捕获异常(
The method 'forEach' was called on null),原因是Facebook类型的响应中不存在payload对象,和JSON结构表现一致 - 控制台输出截图如下:

场景2:关闭「优先使用Default标签页响应」滑块开关
观测现象:
- 返回的
fulfillmentMessages列表长度为2,长度异常原因暂不明确 - 遍历访问元素payload属性时同样抛出未捕获异常(
The method 'forEach' was called on null) - 控制台输出截图如下:

场景3:删除Facebook响应,仅保留Default标签页的custom_payload
观测现象:
- 返回的
fulfillmentMessages列表长度为2 - 打印列表前两项返回完全重复的键值对内容
- 尝试访问第3项时抛出RangeError(数组越界),符合列表长度为2的预期
- 控制台输出截图如下:

待解答疑问
- 不同场景下
fulfillmentMessages列表长度不一致的原因是什么?有没有方法可以内省各响应对象,明确其组成结构? - 滑块开关状态会影响列表元素排序的原因是什么?开启时排序为
[custom_payload, Facebook quick_reply, 重复custom_payload],关闭时排序为[Facebook quick_reply, custom_payload]。 - 响应列表频繁出现重复内容的原因是什么?除场景3的重复payload外,场景1中访问元素
title属性(而非payload)时,3个元素均可正常打印,其中第0项与第2项内容完全重复,对应截图如下:
内容的提问来源于stack exchange,提问作者Red Baron
相关产品推荐
相关产品推荐

