键入' int'不是类型'字符串'的子类型。飞镖

时间:2018-05-23 09:23:56

标签: android dart flutter

打印语句及其下面的任何内容都不会运行,并且错误消息指出问题是从var time开始的上一行。我还确认earthquakes是一个growableList,这意味着earthquakes[0]应该没有问题,但它没有...我做错了什么?如果问题需要更多澄清,请告诉我,我会提供。 链接到gif错误 链接到GitHub上的code

我的代码中有问题的部分如下。第43行报告错误。

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

class Quake extends StatefulWidget {
  var _data;

  Quake(this._data);

  @override
  State<StatefulWidget> createState() => new QuakeState(_data);
}

class QuakeState extends State<Quake> {
  // https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojson


//      "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojson";
  var _data;


  QuakeState(this._data);

  @override
  Widget build(BuildContext context) {
//    debugPrint(_data['features'].runtimeType.toString());

    List earthquakes = _data['features'];
    return new Scaffold(
        appBar: new AppBar(
          title: new Text("Quakes - USGS All Earthquakes"),
          backgroundColor: Colors.red,
          centerTitle: true,
        ),
        body: new ListView.builder(
            itemCount: earthquakes.length,
            itemBuilder: (BuildContext context, int index) {
              print("${earthquakes[index]}");

              var earthquake = earthquakes[index];
              var time = earthquake['properties']['time'];
              time *= 1000;

              //var dateTime = new DateTime.fromMillisecondsSinceEpoch(int.parse(time));
              //time = new DateFormat.yMMMMd(dateTime).add_jm();
              return new ListTile(
                title: new Text(time ?? "Empty"),
              );
            }));
  }
}

Future<Map> getJson(String url) async {
  return await http.get(url).then((response) => json.decode(response.body));
}

8 个答案:

答案 0 :(得分:4)

title: new Text(time ?? "Empty"),

应该是

title: new Text(time != null ? '$time' : "Empty"),

title: new Text('${time ?? "Empty"}'),

答案 1 :(得分:2)

正如以上答案所指出的,time变量为int,而Text()需要一个String

可能还有另一个问题: 如果timenull,则空感知运算符??将无法正常工作。因为time表达式中的??之前使用了time *= 1000变量。

因此,time *= 1000应该被删除,而Text应该像

Text(time == null ? "Empty" : '${time * 1000}')

注意:在这种情况下,time未被修改。

答案 2 :(得分:1)

摘录下一行的代码是:

title: new Text(time ?? "Empty"),

实际上,它实际上应该如下所示:

title: new Text(time?.toString() ?? "Empty"),

答案 3 :(得分:1)

尽管原始问题已得到很好的回答,但我想显示引起问题的类型问题。

time已声明为 int

Text()需要字符串

time ?? "Empty"的值为time时,类型为 int ,这将导致Text()收到错误的类型。

无论何时显示type 'String' is not a subtype of type 'int'消息,都存在类型不匹配的情况。

答案 4 :(得分:0)

我没有收到任何错误。不知道该告诉你什么...

答案 5 :(得分:0)

这是因为您在应该使用字符串的地方使用了 int 值。使用 int 值或将其转换为字符串作为 intValueName.toString();

答案 6 :(得分:0)

检查您的数据类型。可能是您的时间是一个字符串。在你的情况下它是一个 int,所以抛出一个错误。

解决将Int值转换为String的问题。

将 Int 值转换为 String。

static String checkString(dynamic value) {
    if (value is int) {
      return value.toString();
    } else {
      return value;
    }
  }
}

然后像这样使用

title: Text(checkString(time)),

您也可以在 int 类中使用 .toString() 函数。

title: Text(time.toString(),

您也可以将 int 值转换为 String 并使用它

 String time = "$time”;

答案 7 :(得分:-1)

只需检查是否在ListBuilder的itemBuilder上更改(上下文,索引)的顺序