响应中的http.get和Null类型存在问题

响应中的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

我正在与奥地利公共交通API的OGD合作一个项目,该项目只需要一个带有“stopID”的getter就可以请求一个请求。您还可以连接多个stopID。 这意味着,如果您尝试此链接,您将得到一个包含StopID所有数据的响应:

现在我的问题是: 编号为4133(试用)的stopID在坐标中具有空值。通常我会做一些空检查,但有一些奇怪的行为我从来没有见过。我已经调试到了出错的程度。它在HTTP.get请求中显示:

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,
                  ),
          ],
        );
      }
    },
  ),
);