我正在尝试使用Flutter应用程序从REST API获取数据。我正在json_serializable way
中构建模型类。下面是我的代码。
main.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
生成的类)
// 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
};
对给定URL的JSON响应应如下所示。
[{
"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)
这是为什么?
答案 0 :(得分:5)
我找到的最佳解决方法
int pageCount = int.parse(snapshot.data.data['totalPg'].toString());
答案 1 :(得分:2)
您的dateCreated具有int时间戳,但是您的类别模型具有字符串数据类型。将类别模型中的String dateCreated;
和String lastUpdated;
分别更改为int dateCreated
和int lastUpdated
答案 2 :(得分:1)
最好的方法是使用这个包中的注解。例如
@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? ?? '',
}