Flutter 颤振,FutureBuilder快照错误:type';int';不是类型为';字符串';
当我试图从Flutter 颤振,FutureBuilder快照错误:type';int';不是类型为';字符串';,flutter,dart,xmlhttprequest,Flutter,Dart,Xmlhttprequest,当我试图从Post获取数据时,由于此错误而失败 似乎nodeid变量被视为int类型。 所以我试着在下面这样做 factory Post.fromJson(Map<String, dynamic> json) { return Post( nodeid: nodeid.toString(), factory Post.fromJson(映射json){ 回程站( nodeid:nodeid.toString(), 但它不起作用 下面是完整的代码 impor
Post
获取数据时,由于此错误而失败
似乎nodeid变量被视为int类型。
所以我试着在下面这样做
factory Post.fromJson(Map<String, dynamic> json) {
return Post(
nodeid: nodeid.toString(),
factory Post.fromJson(映射json){
回程站(
nodeid:nodeid.toString(),
但它不起作用
下面是完整的代码
import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
Future<Post> fetchPost() async {
var params = { // Request를 위한 parameters 만듦.
//TODO 서비스키 UTF-8 encoding이 필요함.
"ServiceKey": utf8.encode('t8iGBTBFQc5nMq9ytuMZQ7jxR8ZMzohG%2F5o0i80f%2BehjFhMpkADfArAvFk%2BjHsPMFFEThQgejzujdpfou%2FDWng%3D%3D'),
"cityCode": Uri.encodeFull("25"),
"nodeId": Uri.encodeFull("DJB8001793ND"),
};
Uri uri = Uri.parse('http://openapi.tago.go.kr/openapi/service/ArvlInfoInqireService/getSttnAcctoArvlPrearngeInfoList'); // URI 지정.
final newURI = uri.replace(queryParameters: params); // queryParameters를 넣어 URI를 다시 만듦.
final response = await http.get(
newURI,
headers: {
"Accept": "application/json", // The server is returning you XML, but you are trying to parse that as if it is JSON.
},
);
/*
final responseJson = jsonDecode(response.body);
debugPrint('$responseJson'); //
print('$responseJson'); //{response: {header: {resultCode: 99, resultMsg: SERVICE KEY IS NOT REGISTERED ERROR.}}}
print(Uri.encodeFull("DJB8001793ND")); //I/flutter ( 7299): DJB8001793ND
*/
//return Post.fromJson(responseJson);
if (response.statusCode == 200) {
// If server returns an OK response, parse the JSON.
return Post.fromJson(jsonDecode(response.body));
} else {
// If that response was not OK, throw an error.
throw Exception('Failed to load post');
}
}
class Post {
final String nodeid;
//final String nodenm;
//final int arrtime;
//final int routeno;
Post({
this.nodeid,
//this.nodenm,
//this.arrtime,
//this.routeno
});
factory Post.fromJson(Map<String, dynamic> json) {
return Post(
nodeid: json['nodeid'],
//nodenm: json['nodenm'],
//arrtime: json['arrtime'],
//routeno: json['routeno'],
);
}
}
void main() => runApp(MyApp(post: fetchPost()));
class MyApp extends StatelessWidget {
final Future<Post> post;
MyApp({Key key, this.post}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Fetch Data Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text('Fetch Data Example'),
),
body: Center(
child: FutureBuilder<Post>(
future: post,
builder: (context, snapshot) {
if (snapshot.hasData) { // 만약에 Post에서 데이터가 존재한다면
return Text(snapshot.data.nodeid); // 데이터 스냅샷을 보여준다.
} else if (snapshot.hasError) { // << I got an error from here.
return Text("${snapshot.error}");
}
// By default, show a loading spinner.
return CircularProgressIndicator();
},
),
),
),
);
}
}
导入'dart:async';
导入“dart:convert”;
进口“包装:颤振/材料.省道”;
将“package:http/http.dart”导入为http;
Future fetchPost()异步{
var params={//Request를 위한 参数만듦.
//待办事项서비스키 UTF-8编码이 필요함.
“ServiceKey”:utf8.编码('t8iGBTBFQc5nMq9ytuMZQ7jxR8ZMzohG%2F5o0i80f%2BehjFhMpkADfArAvFk%2BJHSPMFETHQGEJZUJDPFOU%2FDWng%3D%3D'),
“城市代码”:Uri.encodeFull(“25”),
“nodeId”:Uri.encodeFull(“DJB8001793ND”),
};
Uri=Uri.parse('http://openapi.tago.go.kr/openapi/service/ArvlInfoInqireService/getSttnAcctoArvlPrearngeInfoList');//URI지정.
final newURI=uri.replace(queryParameters:params);//queryParameters를 넣어 URI를 다시 만듦.
最终响应=等待http.get(
纽乌里,
标题:{
“Accept”:“application/json”,//服务器返回XML,但您试图将其作为json进行解析。
},
);
/*
final responseJson=jsonDecode(response.body);
debugPrint(“$responseJson”)//
打印(“$responseJson”);//{response:{header:{resultCode:99,resultsg:SERVICE KEY未注册错误。}
print(Uri.encodeFull(“DJB8001793ND”);//I/flift(7299):DJB8001793ND
*/
//return Post.fromJson(responseJson);
如果(response.statusCode==200){
//如果服务器返回OK响应,则解析JSON。
return Post.fromJson(jsonDecode(response.body));
}否则{
//如果该响应不正常,则抛出一个错误。
抛出异常(“加载post失败”);
}
}
班级职位{
最后一个字符串nodeid;
//最后一个字符串nodenm;
//最终到达时间;
//卢特诺终点站;
职位({
这是诺德,
//这个,诺登姆,
//这一次,
//这是鲁特诺
});
factory Post.fromJson(映射json){
回程站(
nodeid:json['nodeid'],
//nodenm:json['nodenm'],
//arrtime:json['arrtime'],
//routeno:json['routeno'],
);
}
}
void main()=>runApp(MyApp(post:fetchPost());
类MyApp扩展了无状态小部件{
未来最后员额;
MyApp({Key-Key,this.post}):超级(Key:Key);
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“获取数据示例”,
主题:主题数据(
主样本:颜色。蓝色,
),
家:脚手架(
appBar:appBar(
标题:文本(“获取数据示例”),
),
正文:中(
孩子:未来建设者(
未来:邮政,
生成器:(上下文,快照){
if(snapshot.hasData){//만약에 邮递에서 데이터가 존재한다면
返回文本(snapshot.data.nodeid);//데이터 스냅샷을 보여준다.
}else if(snapshot.hasError){/如果服务器返回XML,则设置标志不会更改数据类型
其次,我认为api工作不正常
<?xml version="1.0" encoding="UTF-8"?>
<response>
<header>
<resultCode>99</resultCode>
<resultMsg>SERVICE KEY IS NOT REGISTERED ERROR.</resultMsg>
</header>
</response>
如果服务器返回XML,则设置标志不会更改数据类型
其次,我认为api工作不正常
<?xml version="1.0" encoding="UTF-8"?>
<response>
<header>
<resultCode>99</resultCode>
<resultMsg>SERVICE KEY IS NOT REGISTERED ERROR.</resultMsg>
</header>
</response>
if(snapshot.hasData){//만약에 邮递에서 데이터가 존재한다면
返回文本(snapshot.data.nodeid);//데이터 스냅샷을 보여준다.
}else if(snapshot.hasrerror){/if(snapshot.hasData){//만약에 邮递에서 데이터가 존재한다면
返回文本(snapshot.data.nodeid);//데이터 스냅샷을 보여준다.
}else if(snapshot.hasrerror){//您的服务返回一个不同的结构,为什么您要解析它,因为它只是一个对象?@diegoveloper您的意思是我需要分离项目吗?我不明白不同结构的含义。我想知道为什么您在尝试解析数据时没有出错您的服务返回一个不同的结构,为什么您要解析它,因为它只是一个对象t?@diegoveloper你的意思是我需要分开项目吗?我不知道不同结构的含义。我想知道为什么你在尝试解析数据时没有出现错误服务器返回JSON,我认为编码的serviceKey
是个问题。你知道如何使用Uri.encodeFull
获取utf8编码的serviceKey吗?你能告诉我是什么吗您正在使用的ich服务?我可能可以自己查看文档?@moficodes nvm!我做了一件蠢事,我一直在尝试对一个已编码的serviceKey进行编码:-0。感谢您的评论服务器返回JSON。我认为编码的serviceKey
是一个问题。您知道如何通过使用Uri.encodeFull
?您能告诉我您使用的是哪种服务吗?我可能自己也可以查看文档?@moficodes nvm!我做了一件愚蠢的事,我一直在尝试对一个已经编码的serviceKey进行编码:-0。感谢您的评论。我认为此错误发生在快照之后。hasData
返回False
。我认为此错误发生在快照之后。hasData
返回False
。
if (snapshot.hasData) { // 만약에 Post에서 데이터가 존재한다면
return Text(snapshot.data.nodeid); // 데이터 스냅샷을 보여준다.
} else if (snapshot.hasError) { // << I got an error from here.
return Text("${snapshot.error}");
}
if (snapshot.hasData) { // 만약에 Post에서 데이터가 존재한다면
return Text(snapshot.data.nodeid.toString()); // 데이터 스냅샷을 보여준다.
} else if (snapshot.hasError) { // << I got an error from here.
return Text("${snapshot.error}");
}