Будущий метод вызова API иногда возвращает ноль, иногда нет - PullRequest
1 голос
/ 20 апреля 2020

В этом методе выходные данные выглядят следующим образом:

I / флаттер (2928): 200

I / флаттер (2928): ноль

I / флаттер (2928): [Экземпляр 'Images']

Это приводит к тому, что snapshot.data также становится пустым в моем FutureBuilder. Любая идея, почему это происходит?

Future<List<Images>> getData( File f ) async {

List<Images> list;

// String link = "https://clothest.herokuapp.com/";
String link ="https://us-central1-velvety-rookery-274308.cloudfunctions.net/function-1";
var stream = new http.ByteStream(DelegatingStream.typed(f.openRead()));
var length = await f.length();
var postUri = Uri.parse(link);
var request = new http.MultipartRequest("POST", postUri);
var multipartFileSign = new http.MultipartFile('File', stream, length,
    filename: basename(f.path));
request.files.add(multipartFileSign);
request.headers.addAll({"content-type": "application/json"});
var response = await request.send();

print(response.statusCode); //200 OK

if (response.statusCode == 200){
  response.stream.transform(utf8.decoder).listen((value) {

          var data = json.decode(value);
          var rest = data["Items"] as List;

          list = rest.map<Images>((json) => Images.fromJson(json)).toList();

          print(list.toString());


  });

}
print(list.toString());
return list;

}

1 Ответ

1 голос
/ 22 апреля 2020

Так что мне удалось решить эту проблему, используя другой пакет вместо пакета HTTP. Пакет D ios лучше всего подходит для HTTP-запросов. Обновленный код:

Future<List<Images>> getData( File f ) async {
  List<Images> lst=[];
  String link ="https://us-central1-velvety-rookery-274308.cloudfunctions.net/function-1";
  Dio dio = new Dio();
  FormData formdata = new FormData(); // just like JS
  formdata.add('File', new UploadFileInfo(f, basename(f.path)));
  await dio.post(link, data: formdata, options: Options(
    method: 'POST',
    responseType: ResponseType.JSON // or ResponseType.JSON
)).then((response) {
  print(response);
  if(response.statusCode==200){ //OK
     var responseBody = response.data;  //Map
     var rest = responseBody["Items"] as List;
     //print(rest);
     lst = rest.map<Images>((json) => Images.fromJson(json)).toList();   //instances of 'Images' object
     //print(lst);
  }
}



).catchError((error) => print(error));

return lst;
...