响应中的http.get和Null类型存在问题
我正在与奥地利公共交通API的OGD合作一个项目,该项目只需要一个带有“stopID”的getter就可以请求一个请求。您还可以连接多个stopID。 这意味着,如果您尝试此链接,您将得到一个包含StopID所有数据的响应: 现在我的问题是: 编号为4133(试用)的stopID在坐标中具有空值。通常我会做一些空检查,但有一些奇怪的行为我从来没有见过。我已经调试到了出错的程度。它在HTTP.get请求中显示:响应中的http.get和Null类型存在问题,http,flutter,dart,get,Http,Flutter,Dart,Get,我正在与奥地利公共交通API的OGD合作一个项目,该项目只需要一个带有“stopID”的getter就可以请求一个请求。您还可以连接多个stopID。 这意味着,如果您尝试此链接,您将得到一个包含StopID所有数据的响应: 现在我的问题是: 编号为4133(试用)的stopID在坐标中具有空值。通常我会做一些空检查,但有一些奇怪的行为我从来没有见过。我已经调试到了出错的程度。它在HTTP.get请求中显示: I/flutter (29464): ERROR: Invalid argument
I/flutter (29464): ERROR: Invalid argument(s) (input): Must not be null
但如果我现在还没有得到回应,那怎么可能呢?
它试图请求并在构建响应时中断
这是它的请求代码(finalURl
是上面的URL):
final Response Response=wait http.get(finalUrl);
如果(response.statusCode==200){
最终编码=jsonDecode(response.body);
}
该错误甚至发生在if
语句和解析json字符串之前。
所以在它得到正确的响应对象之前。如果您现在问我如何知道为什么会因为坐标字段中的NULL类型而发生这种情况,我已经尝试了没有ID 4133的请求,并且效果很好。如果我只使用第二个请求链接(只有ID 4133),它会抛出错误。
有人知道那里出了什么问题吗?这显然是Dart/FLIFT的问题,我错过了什么吗?我不确定您是如何导入http包的。如果使用“http”别名调用get(),请确保按如下方式导入:
import 'package:http/http.dart' as http;
并将包中的响应类用作
http.Response;
我试图从给定的url获取数据,这对我很有效
...
import 'package:http/http.dart' as http;
...
Future<void> fetchData() async {
const url = "http://www.wienerlinien.at/ogd_realtime/monitor?&stopId=4133";
final http.Response response = await http.get(url);
final data = json.decode(response.body) as Map<String, dynamic>;
print(data);
}
然后可以对数据执行空检查。也可以尝试在调用fetchData()函数的任何位置将代码放入try-catch块中,以正确处理错误。我这样做获取并添加???”任何可能返回为NULL的字符串值。和使用??0表示整数
Widget _loadPage() {
Future<List<JsonHomeMembers>> getMembers() async {
var data = await http
.get(finalUrl);
var dataDecoded = json.decode(data.body);
_updateMessage = dataDecoded.toString();
List<JsonHomeMembers> posts = List();
dataDecoded.forEach(
(post) {
int memberId = post["member_id"] ?? 0;
String memberUserName = post["member_username"];
String memberJoinDate = post["member_join_date"];
String memberRole = post["member_role_text"] ?? '';
posts.add(
JsonHomeMembers(
memberId,
memberUserName,
memberJoinDate,
memberRole),
);
},
);
return posts;
}
return Container(
child: FutureBuilder(
future: showPosts(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return ListView.builder(
shrinkWrap: true,
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Text(
snapshot.data[index].memberUserName, style: TextStyle(fontSize: 16, fontWeight: FontWeight.w200, color: Colors.white),
),
Text(
snapshot.data[index].memberJoinDate, style: TextStyle(fontSize: 16, fontWeight: FontWeight.w200, color: Colors.white),
),
Text(
snapshot.data[index].memberRole, style: TextStyle(fontSize: 16, fontWeight: FontWeight.w200, color: Colors.white),
),
],
);
},
);
} else {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Data not available! Check your internet connection!',
style: globals.blueGrey_20_700,
),
],
);
}
},
),
);
Widget\u loadPage(){
Future getMembers()异步{
var data=wait http
.获得(最终);
var dataDecoded=json.decode(data.body);
_updateMessage=dataDecoded.toString();
List posts=List();
dataDecoded.forEach(
(职位){
int memberId=post[“member_id”]??0;
字符串memberUserName=post[“member_username”];
字符串memberJoinDate=post[“成员加入日期”];
字符串memberRole=post[“成员角色文本”]??“”;
posts.add(
JsonHomeMembers(
memberId,
成员用户名,
成员日期:,
成员角色),
);
},
);
返回岗位;
}
返回容器(
孩子:未来建设者(
future:showPosts(),
生成器:(上下文,快照){
if(snapshot.hasData){
返回ListView.builder(
收缩膜:对,
itemCount:snapshot.data.length,
itemBuilder:(上下文,索引){
返回列(
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
正文(
snapshot.data[index].memberUserName,样式:TextStyle(fontSize:16,fontWeight:fontWeight.w200,颜色:Colors.white),
),
正文(
snapshot.data[index].memberJoinDate,样式:TextStyle(fontSize:16,fontWeight:fontWeight.w200,颜色:Colors.white),
),
正文(
snapshot.data[index].memberRole,样式:TextStyle(fontSize:16,fontWeight:fontWeight.w200,颜色:Colors.white),
),
],
);
},
);
}否则{
返回列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
正文(
'数据不可用!请检查您的internet连接!',
款式:globals.blueGrey_20_700,
),
],
);
}
},
),
);
}你能附上完整的stacktrace吗?@julemand101这是奇怪的部分。没有stacktrace,只有这一行弹出,应用程序停止运行。你能举一个小例子,重现你可以附加到你的问题上的问题吗?是的,这肯定有效。我的问题是,在我检查值是否为null之前,错误出现得更早。甚至在json解析发生之前,我就在2小时后发现了问题。问题不在于get请求,而在于我的模型,它在空的出发列表中错误地处理了出发时间。但是,它告诉我,调试器每次在get请求之后都会停止,并且从未传递if语句来检查状态代码。很高兴您找到了解决方案:D
I/flutter (20609): {data: {monitors: [{locationStop: {type: Feature, geometry: {type: Point, coordinates: [null, null]}, properties: {name: 60200949, title: Oberlaa, municipality: Wien, municipalityId: 90001, type: stop, coordName: WGS84, gate: 2, attributes: {rbl: 4133}}}, lines: [{name: U1, towards: NICHT EINSTEIGEN ! NO DEPARTURE PLATFORM, direction: R, platform: 2, richtungsId: 2, barrierFree: true, realtimeSupported: true, trafficjam: false, departures: {departure: [{departureTime: {}, vehicle: {name: U1, towards: NICHT EINSTEIGEN ! NO DEPARTURE PLATFORM, direction: R, richtungsId: 2, barrierFree: false, realtimeSupported: true, trafficjam: false, type: ptMetro, attributes: {}, linienId: 301}}]}, type: ptMetro, lineId: 301}], attributes: {}}]}, message: {value: OK, messageCode: 1, serverTime: 2020-07-19T15:55:30.000+0200}}
Widget _loadPage() {
Future<List<JsonHomeMembers>> getMembers() async {
var data = await http
.get(finalUrl);
var dataDecoded = json.decode(data.body);
_updateMessage = dataDecoded.toString();
List<JsonHomeMembers> posts = List();
dataDecoded.forEach(
(post) {
int memberId = post["member_id"] ?? 0;
String memberUserName = post["member_username"];
String memberJoinDate = post["member_join_date"];
String memberRole = post["member_role_text"] ?? '';
posts.add(
JsonHomeMembers(
memberId,
memberUserName,
memberJoinDate,
memberRole),
);
},
);
return posts;
}
return Container(
child: FutureBuilder(
future: showPosts(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return ListView.builder(
shrinkWrap: true,
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Text(
snapshot.data[index].memberUserName, style: TextStyle(fontSize: 16, fontWeight: FontWeight.w200, color: Colors.white),
),
Text(
snapshot.data[index].memberJoinDate, style: TextStyle(fontSize: 16, fontWeight: FontWeight.w200, color: Colors.white),
),
Text(
snapshot.data[index].memberRole, style: TextStyle(fontSize: 16, fontWeight: FontWeight.w200, color: Colors.white),
),
],
);
},
);
} else {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Data not available! Check your internet connection!',
style: globals.blueGrey_20_700,
),
],
);
}
},
),
);