(解决)(类型'String'不是类型'int'的子类型)-Flutter

时间:2020-02-17 05:43:00

标签: json firebase flutter firebase-realtime-database dart

此问题已经回答,如果您认为自己有相同的错误,请继续阅读,答案由用户给出:Tariqul Islam

由于几天前更新频繁,我的代码显示以下错误:

_TypeError(类型'String'不是类型'int'的子类型)

显然,在此更新之前,即使从“ int”更改为“ String”后,应用程序也可以正常运行,但我却得到了相同的错误,但反之:

_TypeError(类型“ int”不是类型“ String”的子类型)

尽管我更改了值,但对我来说仍然出现相同的错误,也很清楚我正在使用的RestApi没有任何更改。

进入“ Chip”时出现错误,将其更改为“ String”后,在“ Number”中出现了相同的错误,并且在更改了这两个错误之后,出现了同样的错误,但是如上所述。 / p>

这里是Json文件模型:

          class EventoModel {
        String id;
        String nombreEvento;
        List<Participantes> participantes;

        EventoModel({
          this.id,
          this.nombreEvento,
          this.participantes
        });

        factory EventoModel.fromJson(Map<String, dynamic> parsedJson){
          var list = parsedJson['participantes'] as List;
          //print(list.runtimeType);
          List<Participantes> participantesList = list.map((i) => Participantes.fromJson(i)).toList();
          return EventoModel(
            id            : parsedJson ['id'],
            nombreEvento  : parsedJson ['nombreEvento'],
            participantes : participantesList
          );
        }
      }

      class Participantes {
      String uniqueId;
      String apellido;
      int chip;
      String nombre;
      int numero;
      String place;
      String tiempo;

      Participantes({
        this.apellido,
        this.chip,
        this.nombre,
        this.numero,
        this.place,
        this.tiempo,
      });

      factory Participantes.fromJson(Map<String, dynamic> parsedJson) {
        //print(list.runtimeType);
        return Participantes(
          apellido  : parsedJson['Apellido'],
          chip      : parsedJson['Chip'],
          nombre    : parsedJson['Nombre'],
          numero    : parsedJson['Numero'],
          place     : parsedJson['Place'],
          tiempo    : parsedJson['Tiempo'],
        );
      }

      Map<String, dynamic> toJson() {
        return {
          'Apellido'  : apellido,
          'Chip'      : chip,
          'Nombre'    : nombre,
          'Numero'    : numero,
          'Place'     : place,
          'Tiempo'    : tiempo,
        };
      }
    }

这是Json文件示例:

              {
              "nombreEvento" : "Clasico El Colombiano 2020",
              "participantes" : [ {
                "Apellido" : "MARTINEZ GUTIERREZ",
                "Chip" : "739",
                "Nombre" : "JOSE",
                "Numero" : "139",
                "Place" : "1.",
                "Tiempo" : "00:30:12,91"
                }, {
                "Apellido" : "SUAREZ MORERA",
                "Chip" : "707",
                "Nombre" : "DANIEL",
                "Numero" : "107",
                "Place" : "2.",
                "Tiempo" : "02:00:17,54"
                }, {
                "Apellido" : "RODRIGUEZ VARGAS",
                "Chip" : "1686",
                "Nombre" : "JOSE LUIS",
                "Numero" : "274",
                "Place" : "3.",
                "Tiempo" : "02:01:09,09"
                }
              ]
            }

有人可以帮我吗? :c

5 个答案:

答案 0 :(得分:0)

只需int chipString chip,以及int numeroString numero,因为在您的 JSON 中,数据来自String

 class Participantes {
      String uniqueId;
      String apellido;
      String chip;
      String nombre;
      String numero;
      String place;
      String tiempo;

      Participantes({
        this.apellido,
        this.chip,
        this.nombre,
        this.numero,
        this.place,
        this.tiempo,
      });

答案 1 :(得分:0)

在Json中,您将Chip和Numero作为String接收,但是在模型文件中,您将其声明为整数。在模型文件中将数据类型更改为String。

String numero;
String chip;

答案 2 :(得分:0)

根据您提供的JSON,我在下面做了一个模型类: 退房,让我知道:

// To parse this JSON data, do
//
//     final eventoModel = eventoModelFromJson(jsonString);

import 'dart:convert';

EventoModel eventoModelFromJson(String str) => EventoModel.fromJson(json.decode(str));

String eventoModelToJson(EventoModel data) => json.encode(data.toJson());

class EventoModel {
    String nombreEvento;
    List<Participante> participantes;

    EventoModel({
        this.nombreEvento,
        this.participantes,
    });

    factory EventoModel.fromJson(Map<String, dynamic> json) => EventoModel(
        nombreEvento: json["nombreEvento"],
        participantes: List<Participante>.from(json["participantes"].map((x) => Participante.fromJson(x))),
    );

    Map<String, dynamic> toJson() => {
        "nombreEvento": nombreEvento,
        "participantes": List<dynamic>.from(participantes.map((x) => x.toJson())),
    };
}

class Participante {
    String apellido;
    String chip;
    String nombre;
    String numero;
    String place;
    String tiempo;

    Participante({
        this.apellido,
        this.chip,
        this.nombre,
        this.numero,
        this.place,
        this.tiempo,
    });

    factory Participante.fromJson(Map<String, dynamic> json) => Participante(
        apellido: json["Apellido"],
        chip: json["Chip"],
        nombre: json["Nombre"],
        numero: json["Numero"],
        place: json["Place"],
        tiempo: json["Tiempo"],
    );

    Map<String, dynamic> toJson() => {
        "Apellido": apellido,
        "Chip": chip,
        "Nombre": nombre,
        "Numero": numero,
        "Place": place,
        "Tiempo": tiempo,
    };
}

答案 3 :(得分:0)

如果未明确指定变量的类型,则该变量的类型为动态。动态关键字也可以显式用作类型注释。

您可以使用dynamic代替int,它将解决问题。

class Participantes {
  String uniqueId;
  String apellido;
  dynamic chip;
  String nombre;
  dynamic numero;
  String place;
  String tiempo;

  Participantes({
    this.apellido,
    this.chip,
    this.nombre,
    this.numero,
    this.place,
    this.tiempo,
  });

答案 4 :(得分:0)

我喜欢这个问题,在这种情况下,我确实定义了从int到dynamic的类型,然后解决了。例如:在Firebase端,我定义了数字类型,并以动态类型读取它。如果您在代码中进行int操作,它将警告您“类型'int'不是类型'String'的子类型”,但是如果您定义了动态类型,它将解决。 代码示例在下面。

//class Survey
class Survey {
  String name;
  dynamic vote;  // before it was int type and I have changed
  DocumentReference reference;
  
  Survey.fromMap(Map<String, dynamic> map, {this.reference})

      //datanın var olup olmadığını kontrol et eğer varsa kullan
      : assert(map["name"] != null),
        assert(map["vote"] != null),
        name = map["name"],
        vote = map["vote"];
        
  Anket.fromSnapshot(DocumentSnapshot snapshot)
      : this.fromMap(snapshot.data(), reference: snapshot.reference);
      
}