Я новичок в разработке Flutter, и у меня есть проект, который должен использовать API для входа в систему, но я столкнулся с такой ошибкой:
type 'String' is not a subtype of type 'Map<dynamic, dynamic>'
может ли кто-нибудь помочь мне решить проблему выше?
вот мой код:
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
class AuthService {
static String? token;
Future<bool> login({
required String email,
required String password,
}) async {
try {
var response = await Dio().post(
"http://my-api/index/login",
options: Options(
headers: {
"Content-Type": "application/json",
},
),
data: {
"email": email,
"password": password,
},
);
if (response.statusCode == 200) {
Map obj = response.data;
token = obj["data"]["token"];
return true;
} else {
throw Exception('Failed to login');
}
} on DioException catch (e) {
if (e.response?.statusCode == 401) {
debugPrint('Error 400: ${e.response?.data}');
throw Exception('Invalid email or password');
} else {
debugPrint('Error: ${e.toString()}');
throw Exception('Failed to login');
}
}
}
}
вот структура API:
{
"status": 200,
"message": "login success",
"data": {
"id": "622b",
"email": "[email protected]",
"roleId": "a11ea",
"biodateId": "ba2",
"createdAt": "2024",
"updatedAt": "2024",
"token": "token" }
}
если ошибка:
{
"status": 401,
"message": "Wrong Password"
}
окей, подожди немного
Я добавил код. Надеюсь, поможет...
спасибо за ответ, мистер Арзак, я пытался исправить код, но ошибка все равно возникает: ``` if (response.statusCode == 200) { Map obj = jsonDecode(response.data); токен = obj["данные"]["токен"]; вернуть истину; } ``` ошибка: Ошибка во время входа в систему: FormatException: Неожиданный символ (в строке 2, символ 1) <!-- HTML для сборки пакета статического дистрибутива -->
@Dzy Я обновил свой ответ, проверьте, работает ли он у вас.





Убедитесь, что ваша обработка ответа правильно отражает структуру JSON, возвращаемую вашим API.
try {
Response<dynamic> response = await dio.post(
"http://my-api/index/login",
options: Options(
headers: {
"Content-Type": "application/json",
},
),
data: {
"email": email,
"password": password,
},
);
if (response.statusCode == 200) {
if (response.data is Map<String, dynamic>) {
Map<String, dynamic> responseData = response.data;
Map<String, dynamic> data = responseData['data'];
token = data['token'];
return true;
} else {
throw Exception('Failed to parse data');
}
} else if (response.statusCode == 401) {
throw Exception(response.data['message'] ?? 'Unauthorized');
} else {
throw Exception('Failed to login');
}
} on DioError catch (e) {
if (e.response?.statusCode == 401) {
print('Error 401: ${e.response?.data}');
} else {
print('Error: ${e.toString()}');
}
} catch (e) {
print('Error: ${e.toString()}');
}
спасибо за ответ, я попытался исправить свой код, но ошибка все та же: «Ошибка при входе в систему: тип «String» не является подтипом типа «Map<String, Dynamic>»
это работает, спасибо, что помогли мне решить проблему :)
Укажите структуру ответа API.