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

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

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

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

api当前看起来是这样的

{
    "error": false,
        "data": [
           {
              "name": "conner",
              "age": 24
            },
            {
              "name": "andrew",
              "age": 20
            }
         ],
         "message": "Todos list."
         }

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

import 'dart:async';
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

void main() {
  runApp(new MaterialApp(
    home: new HomePage(),
  ));
}

class HomePage extends StatefulWidget {
  @override
  HomePageState createState() => new HomePageState();
}
class HomePageState extends State<HomePage> {

  Map<String,dynamic> data;

  Future<String> getData() async {
    var response = await http.get(
        Uri.encodeFull("http://10.1.0.109:8080/names"),
        headers: {
          "Accept": "application/json"
        }
    );

    this.setState(() {
      data = JSON.decode(response.body);
    });
    print (data[1]["data"]);

    return "Success!";
  }

  @override
  void initState() {
    super.initState();
    this.getData();
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Listviews"),
      ),
      body: new ListView.builder(
        itemCount: data == null ? 0 : data["data"].length,
        itemBuilder: (BuildContext context, int index) {
          return new Card(
            child: new Text(data[index]["data"]),
          );
        },
      ),
    );
  }
}
0pizxfdo

0pizxfdo1#

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

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

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

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

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

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

相关问题