在 Dart 中解析来自 http GET 请求的数据时出错

时间:2021-01-22 14:13:41

标签: flutter material-design

我对 Flutter 比较陌生,我目前正在尝试从 Wordpress 网站获取帖子。在之前的一个项目中,我有一个函数,但现在它不再起作用了。

这是函数(我替换了网址):

Future<List<Artikel>> fetchArticelList(int artikel) async{
  print("Loading Articels");
  try {
    final response = await http.get(
      'https://WORDPRESSURL/wp-json/wp/v2/posts?_embed&per_page=' + artikel.toString(), 
      headers: {"Accept":"application/json"},
    );
    if (response.statusCode == 200) {
      List<Artikel> artikel = json.decode(response.body)
          .cast<Map<String, dynamic>>()
          .map<Artikel>((json) => Artikel.fromJson(json))
          .toList();
      return artikel;
    } else {
      throw Exception("Error");
    }
  } catch(e){
    throw Exception(e.toString());
  }
}

这是错误:

E/flutter (10158): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: Exception: Exception: NoSuchMethodError: The method '[]' was called on null.
E/flutter (10158): Receiver: null
E/flutter (10158): Tried calling: [](0)

我用调试器运行了它,我发现它在第 7 行失败,并带有“.toList();” (它在一个单独的行中,所以我可以用调试器测试它,这不是导致错误的原因)。正如我所说,我对 Flutter 比较陌生,我只是从以前的项目中复制了这个,所以我不知道它有什么作用了。该函数在类 Articel 中,这是我调用该函数的 Widget:

class _androidThomsLineLoadingScreenState extends State<androidThomsLineLoadingScreen> {
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    Artikel().fetchArticelList(100).then((value) => Navigator.pushReplacementNamed(context, '/artikelListView', arguments: {'artikelList': value}));
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.transparent,
      body: Center(
        child: SpinKitWave(
          color: Color(0xffa51a3e),
        ),
      ),
    );
  }
}

这里是 .jsonFunction:

factory Artikel.fromJson(Map<String, dynamic> json) {
    if (json == null) {
      print("got Empty JSON");
      return null;
    } else {
      print("Erstelle Artikel");
    }
    try {
      //Initialising one line Parameters
      final String renderedTitle =
          new HtmlUnescape().convert(json['title']['rendered']);
      String date = DateFormat.yMd().format(DateTime.parse(json['date']));
      String imageUrl = json['_embedded']['wp:featuredmedia'][0]
          ['media_details']['sizes']['medium']['source_url'];
      String url = json['guid']['rendered'];
      String excerpt = parse(json['excerpt']['rendered'].toString())
          .documentElement
          .text
          .replaceAll(r'\n', r'');
      bool thumbnailProvided = false;

      //Get Author(s)
      List<String> authorsNameList = [];
      String authorString = '';
      List<int> authorIdList = [];
      if (json['_embedded']['author'] != null) {
        for (int i = 0; i < json['_embedded']['author'].length; i++) {
          //Generating authorString
          if (i > 0) authorString = authorString + ', ';
          authorString = authorString + json['_embedded']['author'][i]['name'];

          //Generating authorsNameList
          authorsNameList.add(json['_embedded']['author'][i]['name']);

          //Generating authorIdList
          authorIdList.add(json['_embedded']['author'][i]['id']);
        }
      }

      //Generate HTML for Content
      // String content = parse(json['content']['rendered'].replaceAll(r'\n', r'').replaceAll(r'\"', r'"').toString()).documentElement.text; //Just Text, no formating
      String content = '<h1>$renderedTitle</h1><h4>$date $authorString</h4>' +
          json['content'][
              'rendered']; //HTML Text from API without Pictures                                                                              //HTML Text from APi
      return Artikel(
        title: renderedTitle,
        date: date,
        url: url,
        imageUrl: imageUrl,
        content: content,
        excerpt: excerpt, //Rmeoving HTML from Text
        authorString: authorString,
        authorIdList: authorIdList,
        authorsNameList: authorsNameList,
        thumbnailProvided: thumbnailProvided,
      );
    } catch (e) {
      throw Exception(e.toString());
    }
  }

我希望你能帮助我,这可能是一个非常严重的错误,但我现在正在努力解决大约一天。

编辑:根据要求:这里是 request.body。如您所见,它是一个 JSON 列表,长度通常由参数“artikel”决定,但我在这里只放了一个(我也替换了 Wordpress URL):https://pastebin.com/5NrB6GkD

1 个答案:

答案 0 :(得分:0)

正如我所想,这是一个非常愚蠢的错误。错误是,有一个字符串有时为空,但我看到了。