Flutter/Dart - 关于如何对未来进行故障排除的建议?

Posted

技术标签:

【中文标题】Flutter/Dart - 关于如何对未来进行故障排除的建议?【英文标题】:Flutter/Dart - Suggestions for how to Troubleshoot a Future? 【发布时间】:2020-11-12 10:37:00 【问题描述】:

虽然它以前可以工作,但由于某种原因,我的代码现在已经停止工作。尽管它会获取所需的 json 数据,但构建不会呈现。我的应用页面上应该显示页面视图的错误是;

type String is not a subtype of 'Map<String,dynamic>' 

但经过一些调整,现在错误是;

invalid arguments(s)

我想我可能已经把范围缩小到了未来;

FutureBuilder<List<SpeakContent>> futureStage() 
  return new FutureBuilder<List<SpeakContent>>(
    future: downloadJSON(),
    builder: (context, snapshot) 
      if (snapshot.hasData) 
       print("Snapshot has data.");
        List<SpeakContent> speakcrafts = snapshot.data;
        return new CustomPageView(speakcrafts);
       else if (snapshot.hasError) 
        return Text('$snapshot.error');
      
      return new CircularProgressIndicator();
    ,
  );


Future<List<SpeakContent>> downloadJSON() async 
  final jsonEndpoint =
      "http://example.com/getContent.php?";    
  final response = await get(jsonEndpoint);

  if (response.statusCode == 200)     
    List speakcrafts = json.decode(response.body);
    debugPrint(speakcrafts.toString());
    return speakcrafts
        .map((speakcraft) => new SpeakContent.fromJson(speakcraft))
        .toList();
   else
    throw Exception('We were not able to successfully download the json data.');

虽然它没有抛出错误,但我注意到它没有在“if (snapshot.hasData)”行之后打印我的测试语句。

我不应该看到“快照有数据”吗?出现在我的 android Studio 控制台中?

【问题讨论】:

可能是因为你的未来永远不会解决/永远不会返回。您可以在构建器函数或小部件/状态中向上移动未来,将其保存在像final downloadFuture = downloadJSON() 这样的变量中,然后使用future: downloadFuture,并添加downloadFuture.then 回调以检查它是否真正解决。 你能显示方法downloadJSON吗? 根据要求,我刚刚编辑并包含了下载Json Claudio Redi。 【参考方案1】:

根据您提供的内容,此

type String is not a subtype of 'Map<String,dynamic>' 

必须是这样的:

return Text('$snapshot.error');

这意味着您的downloadJSON() 引发了异常。在这种情况下,print('Snapshot has data.'); 永远不会执行,而我上面引用的下一个案例将被执行。

请在downloadJSON()的正文中下一个断点,逐行运行,看看抛出了什么。

另外,您在这里犯了一个无关紧要但很大的错误。不要像这样打电话给downloadJSON()。此函数在每次重新渲染时执行,可能多次。您将在每次重绘小部件时启动 JSON 下载。这可能会增加您的后端账单......我在这次谈话中更详细地解释了它:https://youtu.be/vPHxckiSmKY?t=4771

【讨论】:

谢谢!我现在知道它正在检索 json 数据,因为将 debugPrint(speakcrafts.toString());就在 List speakcrafts = json.decode(response.body) 在控制台中生成所需的 json 数据之后。 感谢您的接受。顺便说一句,type String is not a subtype of 'Map&lt;String,dynamic&gt;' 意味着你正在做这样的任务'Map&lt;String,dynamic&gt;' = String【参考方案2】:

按照 Gazihan Alankus 和 scrimau 的建议执行故障排除提示后,我找到了罪魁祸首,即 mysql 数据库中的单个空条目。太可怕了……我得想办法在未来预防这个问题。

【讨论】:

有道理,在 json 解析期间,null 条目可能被转换为空字符串而不是映射,这就是您收到该错误的原因。

以上是关于Flutter/Dart - 关于如何对未来进行故障排除的建议?的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter/dart 的 Futurebuilder 中访问我的未来不起作用

与 Flutter 共创未来 | Flutter Forward 活动精彩回顾

与 Flutter 共创未来 | Flutter Forward 活动精彩回顾

如何在 Flutter/Dart 中使用 url 编码的标头和正文发出 HTTP POST 请求

Flutter/Dart 中的 TDD。如何减少启动时间

如何使用 Flutter/Dart 检查 Firebase 数据库中是不是存在节点