Flutter «String» не является подтипом типа «Map<dynamic, Dynamic>»

Я новичок в разработке 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"
}

Укажите структуру ответа API.

DroidFlutter 20.06.2024 06:26

окей, подожди немного

Dzy 20.06.2024 06:39

Я добавил код. Надеюсь, поможет...

DroidFlutter 20.06.2024 06:44

спасибо за ответ, мистер Арзак, я пытался исправить код, но ошибка все равно возникает: ``` if (response.statusCode == 200) { Map obj = jsonDecode(response.data); токен = obj["данные"]["токен"]; вернуть истину; } ``` ошибка: Ошибка во время входа в систему: FormatException: Неожиданный символ (в строке 2, символ 1) <!-- HTML для сборки пакета статического дистрибутива -->

Dzy 20.06.2024 06:53

@Dzy Я обновил свой ответ, проверьте, работает ли он у вас.

DroidFlutter 20.06.2024 07:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Убедитесь, что ваша обработка ответа правильно отражает структуру 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>»

Dzy 20.06.2024 06:50

это работает, спасибо, что помогли мне решить проблему :)

Dzy 20.06.2024 07:55

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