长笛/飞镖-如何解决未来问题的建议



尽管它以前可以工作,但由于某种原因,我的代码现在已经停止工作。尽管它获取了所需的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.');
}

虽然它没有抛出错误,但我注意到它不会在"之后打印我的测试语句;如果(snapshot.hasData(";线

难道我不应该看到";快照有数据"出现在我的Android Studio控制台中?

根据您提供的内容,此

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

按照Gazihan-Alankus和scrimau的建议执行故障排除提示后,我发现了罪魁祸首,那就是MYSQL数据库中的一个空条目。恐怖的要想办法防止将来出现这种问题。

最新更新