繁体   English   中英

Flutter 错误:“int”类型不是类型转换中“String”类型的子类型

[英]Flutter error: type 'int' is not a subtype of type 'String' in type cast

我正在尝试使用 Flutter 应用程序从 REST API 获取数据。 我正在以json_serializable way构建 model 个类。 下面是我的代码。

主要.dart

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

import './category.dart';

void main()
{
  runApp(MyApp());
}

class MyApp extends StatefulWidget
{
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return HttpTestState();
  }

}

class HttpTestState extends State<MyApp>
{
  @override
  Widget build(BuildContext context) {

    //bookFind();
    productFind();

    return MaterialApp(
      title: 'Flutter layout demo',
      home: Scaffold(

        body: Scaffold(appBar: AppBar(title: Text("HTTP Test"),),
    body: Container(child: Text("data"),),)
        ),

    );

  }

productFind() async{
  var url = "http://10.0.2.2:8080/xxx/rest/productCategory/getAllProductCategories";

  // Await the http get response, then decode the json-formatted responce.
  var response = await http.get(Uri.encodeFull(url), headers: {"Accept": "application/json"});
  if (response.statusCode == 200) {
   print("Response Body: "+response.body);

     List userMap = convert.jsonDecode(response.body);
     Category ProductCategories = new Category.fromJson(userMap[0]);

  } else {
    print("Request failed with status: ${response.statusCode}.");
  }
}


}

category.dart (模型类)

import 'package:json_annotation/json_annotation.dart';

part 'category.g.dart';

@JsonSerializable()


class Category
{
  int idproductCategory;
  String categoryName;
  String imageURL;
  String deleteTimestamp;
  String dateCreated;
  String lastUpdated;

  Category(this.idproductCategory, this.categoryName, this.imageURL, this.deleteTimestamp, this.dateCreated, this.lastUpdated);

  factory Category.fromJson(Map<String, dynamic> json) => _$CategoryFromJson(json);

  Map<String, dynamic> toJson() => _$CategoryToJson(this);
}

category.g.dart (由 json_serializable 生成的json_serializable

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'category.dart';

// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************

Category _$CategoryFromJson(Map<String, dynamic> json) {
  return Category(
      json['idproductCategory'] as int,
      json['categoryName'] as String,
      json['imageURL'] as String,
      json['deleteTimestamp'] as String,
      json['dateCreated'] as String,
      json['lastUpdated'] as String);
}

Map<String, dynamic> _$CategoryToJson(Category instance) => <String, dynamic>{
      'idproductCategory': instance.idproductCategory,
      'categoryName': instance.categoryName,
      'imageURL': instance.imageURL,
      'deleteTimestamp': instance.deleteTimestamp,
      'dateCreated': instance.dateCreated,
      'lastUpdated': instance.lastUpdated
    };

JSON 对给定 URL 的响应应如下所示。

[{
        "idproductCategory": 1,
        "categoryName": "Fruits",
        "imageURL": "https://images.unsplash.com/photo-1512621776951-a57141f2eefd?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=60",
        "deleteTimestamp": null,
        "dateCreated": 1550056389000,
        "lastUpdated": 1550056389000
    },
    {
        "idproductCategory": 2,
        "categoryName": "Vegetables",
        "imageURL": "https://images.unsplash.com/photo-1522184216316-3c25379f9760?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=60",
        "deleteTimestamp": null,
        "dateCreated": 1550056389000,
        "lastUpdated": 1550056389000
    }]

但是,当我运行我的代码时,出现以下错误。

E/flutter ( 6448): [ERROR:flutter/shell/common/shell.cc(178)] Dart Error: Unhandled exception:
E/flutter ( 6448): type 'int' is not a subtype of type 'String' in type cast
E/flutter ( 6448): #0      _$CategoryFromJson 
E/flutter ( 6448): #1      new Category.fromJson 
E/flutter ( 6448): #2      HttpTestState.productFind 
E/flutter ( 6448): <asynchronous suspension>
E/flutter ( 6448): #3      HttpTestState.build 
E/flutter ( 6448): #4      StatefulElement.build 
E/flutter ( 6448): #5      ComponentElement.performRebuild 
E/flutter ( 6448): #6      Element.rebuild 
E/flutter ( 6448): #7      BuildOwner.buildScope 
E/flutter ( 6448): #8      _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame 
E/flutter ( 6448): #9      _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback 
E/flutter ( 6448): #10     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback 
E/flutter ( 6448): #11     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame 
E/flutter ( 6448): #12     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> 
E/flutter ( 6448): #13     Timer._createTimer.<anonymous closure> (dart:async/runtime/libtimer_patch.dart:21:15)
E/flutter ( 6448): #14     _Timer._runTimers (dart:isolate/runtime/libtimer_impl.dart:382:19)
E/flutter ( 6448): #15     _Timer._handleMessage (dart:isolate/runtime/libtimer_impl.dart:416:5)
E/flutter ( 6448): #16     _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:171:12)

为什么是这样?

我找到的最佳解决方法

int pageCount = int.parse(snapshot.data.data['totalPg'].toString());

您的 dateCreated 具有 int 时间戳,但您的类别模型具有字符串数据类型。 更改String dateCreated; String lastUpdated; 在类别模型中分别为int dateCreatedint lastUpdated

最好的方法是使用这个包中的注解。 例如

@JsonSerializable(explicitToJson: true)
class Artist {
  String name;
  String listeners;
  @JsonKey(defaultValue: '')
  String mid;
}

将为mid字段生成带有空检查的代码

Artist _$ArtistFromJson(Map<String, dynamic> json) {
  return Artist(
    name: json['name'] as String,
    listeners: json['listeners'] as String,
    mid: json['mid'] as String? ?? '',
}

这对我有用

字符串转整数

Text(DateTime.fromMillisecondsSinceEpoch(int.parse(policy?.policyMsg?.createdDate?.toString() ?? "0")).toIso8601String())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM