Ошибка Flutter JSON — тело метода получения не определено для типа StreamedResponse

Я пытаюсь получить значения, возвращенные после вызова API, но получаю следующее сообщение об ошибке:

Тело метода получения не определено для типа StreamedResponse. Попробуйте импортировать библиотеку, определяющую «тело», исправив имя на имя существующего метода получения или определив метод получения или поле с именем «тело».

Вот мой код:

loginUser() async{
  try{
    final uri = Uri.parse(API.loginURL);
    var request = http.MultipartRequest('POST', uri);

    //Send Input field data
    request.fields['email'] = emailController.text;
    request.fields['password'] = passwordController.text;

    var response = await request.send();

    if (response.statusCode == 200){
      var resBody = jsonDecode(response.body);
      bool success_flag = resBody['success'];
      print("Login successful!");
    }else{
      print("Login failed!");
    }
  }
  catch(e){
    print(e.toString());
  }
}

Кажется, у ответа нет тела

2
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам необходимо прочитать поток ответа и преобразовать его в String, прежде чем пытаться его декодировать:

if ( response.statusCode == 200) {
   var responseData = await http.Response.fromStream(response);
   var resBody = jsonDecode(responseData.body);
   bool success_flag = resBody['success'];
   print("Login successful: $success_flag");
} else {
   ...

PS: не рекомендуется смешивать стили кодирования, и у вас есть CamelCase и Snake_case вместе. Придерживайтесь одного (если не уверены, просто плывите по течению и используйте один, наиболее популярный в данной экосистеме/платформе, которую вы используете).

Вы имеете в виду, что Success_flag должен быть SuccessFlag? И какой стиль именования переменных популярен? Я новичок во Flutter/Dart?

Cliff Odebala Clarke 16.05.2024 09:02

насчет "successFlag" - да. Для единообразия придерживайтесь одного стиля. О стиле Dart см. dartwiki.com/wiki/Dart_Style_Guide/Naming_Conventions — просто используйте то, что делает большинство (вероятно, это CamelCase).

Marcin Orlowski 16.05.2024 11:14

Используйте код, подобный приведенному ниже, с блоками try и catch.

final uri = Uri.parse(API.loginURL);
var request = http.MultipartRequest('POST', uri);

request.fields['email'] = emailController.text;
request.fields['password'] = passwordController.text;

var response = await request.send();

var streamedResponse = await http.Response.fromStream(response);

if (streamedResponse.statusCode == 200) {
  var resBody = jsonDecode(streamedResponse.body);
  bool successFlag = resBody['success'];
  if (successFlag) {
    print("Login successful!");
  } else {
    print("Login failed: ${resBody['message']}");
  }
} else {
  print("Login failed status code: ${streamedResponse.statusCode}");
}

Другие вопросы по теме