在flatter上向本地主机发出http请求不起作用

bq8i3lrv  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(426)

我试图从一个api(格式为json)中获取数据,该api是通过将node.js上的mysql与express连接而创建的。
我在android studio控制台中运行此错误

  1. [VERBOSE-2:dart_error.cc(16)] Unhandled exception:
  2. type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type
  3. 'List<dynamic>'

api当前看起来是这样的

  1. {
  2. "error": false,
  3. "data": [
  4. {
  5. "name": "conner",
  6. "age": 24
  7. },
  8. {
  9. "name": "andrew",
  10. "age": 20
  11. }
  12. ],
  13. "message": "Todos list."
  14. }

我正在使用这个教程,只是用我的“name”替换了他的值“title”,https://www.youtube.com/watch?v=-prrdg163to
这是我正在运行的代码

  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'package:flutter/material.dart';
  4. import 'package:http/http.dart' as http;
  5. void main() {
  6. runApp(new MaterialApp(
  7. home: new HomePage(),
  8. ));
  9. }
  10. class HomePage extends StatefulWidget {
  11. @override
  12. HomePageState createState() => new HomePageState();
  13. }
  14. class HomePageState extends State<HomePage> {
  15. Map<String,dynamic> data;
  16. Future<String> getData() async {
  17. var response = await http.get(
  18. Uri.encodeFull("http://10.1.0.109:8080/names"),
  19. headers: {
  20. "Accept": "application/json"
  21. }
  22. );
  23. this.setState(() {
  24. data = JSON.decode(response.body);
  25. });
  26. print (data[1]["data"]);
  27. return "Success!";
  28. }
  29. @override
  30. void initState() {
  31. super.initState();
  32. this.getData();
  33. }
  34. @override
  35. Widget build(BuildContext context) {
  36. return new Scaffold(
  37. appBar: new AppBar(
  38. title: new Text("Listviews"),
  39. ),
  40. body: new ListView.builder(
  41. itemCount: data == null ? 0 : data["data"].length,
  42. itemBuilder: (BuildContext context, int index) {
  43. return new Card(
  44. child: new Text(data[index]["data"]),
  45. );
  46. },
  47. ),
  48. );
  49. }
  50. }
0pizxfdo

0pizxfdo1#

问题在于json文件的结构与教程中的不同,所以请尝试以下方法

  1. data["data"][1]["name"]

注:
更改数据自 listvar 或者 Map<String,dynamic> ```
Map<String,dynamic> data;

  1. 在此之后,您需要获得列表长度,以便在itemcount中将其更改为

itemCount: data == null ? 0 : data["data"].length,

  1. 完整示例
  2. ![](https://i.stack.imgur.com/diLMF.png)

相关问题