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

Flutter解析Dialogflow fulfillmentMessages异常问题咨询

Flutter对接Dialogflow时fulfillmentMessages解析异常问题

配置说明

  • DEFAULT(默认)响应中配置了一个简单的custom_payload,控制台配置截图如下:
    Dialogflow控制台响应配置页
  • Facebook集成响应配置为一组quick_replies(快速回复),配置截图如下:
    Facebook集成配置页

下载对应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结构表现一致
  • 控制台输出截图如下:
    场景1控制台输出

场景2:关闭「优先使用Default标签页响应」滑块开关

观测现象:

  • 返回的fulfillmentMessages列表长度为2,长度异常原因暂不明确
  • 遍历访问元素payload属性时同样抛出未捕获异常(The method 'forEach' was called on null)
  • 控制台输出截图如下:
    场景2控制台输出

场景3:删除Facebook响应,仅保留Default标签页的custom_payload

观测现象:

  • 返回的fulfillmentMessages列表长度为2
  • 打印列表前两项返回完全重复的键值对内容
  • 尝试访问第3项时抛出RangeError(数组越界),符合列表长度为2的预期
  • 控制台输出截图如下:
    场景3控制台输出

待解答疑问

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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:27:24