首页 > 解决方案 > Flutter:当我尝试访问 JSON 数据的元素时出现 TypeError

问题描述

我正在尝试在动态列表视图上显示 JSON 数据的各个元素。但是,我不断收到“类型'int'不是类型'String'的子类型”错误,我不知道为什么。

如果我在 buildFlightsColumn 函数中位于 Row 下的小部件中仅包含 left() 函数,则该代码有效。但是一旦我包含了 middle() 和 right() 函数,我就会得到错误。

Widget buildListView() {
    print(data);
    return ListView.builder(
      itemCount: data == null ? 0 : data.length,
      itemBuilder:  (context, index) {
        return buildFlightsColumn(data[index]); 
      }
    );
  }


  Widget buildFlightsColumn(dynamic item) => Container( 
    height: 150.0, 
    decoration: BoxDecoration(
    ),
    child: new Row( 
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: <Widget>[ 
        left(item['PlaceId']),
        middle(item['IataCode']),
        right()
      ],
    ),
  );

  Container left(dynamic item) {
    return new Container (
      child: Text(   
        item,
        textAlign: TextAlign.left,
        style: TextStyle(
          fontSize: 25.0,
          color: Colors.red,
        )
      ),
    );
  }

  Container middle(dynamic item) {
    return new Container( 
      child: Text(   
        item,
        textAlign: TextAlign.left,
        style: TextStyle(
          fontSize: 25.0,
          color: Colors.red,
        )
      ),
    );
  }

  Container right() {
    return new Container(
      child: RaisedButton( 
        onPressed: () { 
        },
        child: Text('Book Flights'),
      )
    );
  }

传入 buildFlightsColumn 函数的数据是 API 请求返回的 JSON 数据:

[{PlaceId: 65368, IataCode: LAX, Name: Los Angeles International, Type: Station, SkyscannerCode: LAX, CityName: Los Angeles, CityId: LAXA, CountryName: United States}, {PlaceId: 81727, IataCode: SFO, Name: San Francisco International, Type: Station, SkyscannerCode: SFO, CityName: San Francisco, CityId: SFOA, CountryName: United States}]

标签: jsonapilistviewflutterdart

解决方案


文本小部件不能显示 int s,它们只能解释 strings ,所以你的错误来自这段代码

  Widget buildFlightsColumn(dynamic item) => Container( 
    height: 150.0, 
    decoration: BoxDecoration(
    ),
    child: new Row( 
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: <Widget>[ 
        left(item['PlaceId']) // item['placeId'] is int,
        middle(item['IataCode']),
        right()
      ],
    ),
  );

  Container left(dynamic item) {
    return new Container (
      child: Text(   
        item, // here item is int, which is not allowed <-----------------------
        textAlign: TextAlign.left,
        style: TextStyle(
          fontSize: 25.0,
          color: Colors.red,
        )
      ),
    );
  }

.toString()您可以使用该方法或字符串插值将其数字更改为字符串


  Container left(dynamic item) {
    return new Container (
      child: Text(   
        item.toString(), // here item is String <-----------------------
        textAlign: TextAlign.left,
        style: TextStyle(
          fontSize: 25.0,
          color: Colors.red,
        )
      ),
    );
  }


推荐阅读