颤振:异常 DioError [DioErrorType.DEFAULT]:类型 'String' 不是类型 'Map<String, dynamic>' 的子类型

Posted

技术标签:

【中文标题】颤振:异常 DioError [DioErrorType.DEFAULT]:类型 \'String\' 不是类型 \'Map<String, dynamic>\' 的子类型【英文标题】:flutter: Exception DioError [DioErrorType.DEFAULT]: type 'String' is not a subtype of type 'Map<String, dynamic>'颤振:异常 DioError [DioErrorType.DEFAULT]:类型 'String' 不是类型 'Map<String, dynamic>' 的子类型 【发布时间】:2021-01-21 08:44:15 【问题描述】:

我是 Flutter 的新手,我无法解决这个问题,谁能帮助我? 如果我输入 Future&lt;String&gt; login() 而不是 Future&lt;WrappedResponse&gt; login() ,我能够以字符串形式获取数据,它将打印在下面给出的 Presenter 类上。

这是我的 api 类

import 'dart:io';
import 'dart:math';
import 'package:ceee_app/converters/wrapped_response.dart';
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:retrofit/retrofit.dart';

part 'api_service.g.dart';

@RestApi(baseUrl: "https://******.com/_dev/api/v1/")
abstract class RestClient 
  factory RestClient(Dio dio) = _RestClient;

  @FormUrlEncoded()
  @POST("login")
  Future<WrappedResponse> login(@Field("email") String email, @Field("password") String password, @Field("device_token") String token, @Field("device_type") String type);

这是我的包装类

import 'package:ceee_app/model/user.dart';
import 'package:json_annotation/json_annotation.dart';

part 'wrapped_response.g.dart';

@JsonSerializable()

class WrappedResponse
  @JsonKey(name: "message")
  String message;
  @JsonKey(name: "status")
  String status;
  @JsonKey(name: "result")
  User data;

  WrappedResponse();

  factory WrappedResponse.fromJson(Map<String, dynamic> json) => _$WrappedResponseFromJson(json);
  Map<String, dynamic> toJson() => _$WrappedResponseToJson(this);


这是我的用户类

import 'package:json_annotation/json_annotation.dart';

part "user.g.dart";

@JsonSerializable()
class User
  @JsonKey()
  int id;
  @JsonKey()
  String name;
  @JsonKey()
  String l_name;
  @JsonKey()
  String email;
  @JsonKey()
  String session_token;
  @JsonKey()
  String device_token;

  User();

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);

  Map<String, dynamic> toJson() => _$UserToJson(this);


这是我的 Presenter 类

import 'package:ceee_app/contracts/login_activity_contract.dart';
import 'package:ceee_app/model/user.dart';
import 'package:ceee_app/webservices/api_service.dart';
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:shared_preferences/shared_preferences.dart';

class LoginActivityPresenter implements LoginActivityInteractor 
  LoginActivityView view;
  LoginActivityPresenter(this.view);
  RestClient api = RestClient(Dio());

  @override
  void success(String token) async 
    SharedPreferences prefs = await SharedPreferences.getInstance();
    await prefs.setString("api_token", token);
  

  @override
  void destroy() => view = null;

  @override
  void login(String email, String password, String token, String type) async 
    await api.login(email, password, token, type).then((it)
      debugPrint("Data : "+it.toString());

    ).catchError((e)
      print("Exception $e");
      view?.toast("There is an error!");
    );
  

我的回答是


  "status": 1,
  "message": "Login successful!",
  "result": 
    "id": 20,
    "session_token": "YXBpX3Rva2VuNWY3YzJmODM2ZTgyNjUuNTY1MjUwNzAxNjAxOTc0MTQ3",
    "name": "abd",
    "l_name": "xyz",
    "email": "abc@gmail.com",
    "device_token": "fKrw8mpYT96fWIfaxrF26r:APA91bGZUW1wGSmdNMNb",
  

【问题讨论】:

内容类型是 text/plain 还是 application/json? 【参考方案1】:

您忘记添加 JSON 序列化所需的构造函数参数。

@JsonSerializable()
class WrappedResponse
  @JsonKey(name: "message")
  String message;
  @JsonKey(name: "status")
  String status;
  @JsonKey(name: "result")
  User data;

  WrappedResponse(this.message, this.status, this.data);

  factory WrappedResponse.fromJson(Map<String, dynamic> json) => _$WrappedResponseFromJson(json);
  Map<String, dynamic> toJson() => _$WrappedResponseToJson(this);

这同样适用于User 类。

@JsonSerializable()
class User
  ...
  User(this.name, this.l_name, this.email, session_token, this.device_token);  
  ...

【讨论】:

以上是关于颤振:异常 DioError [DioErrorType.DEFAULT]:类型 'String' 不是类型 'Map<String, dynamic>' 的子类型的主要内容,如果未能解决你的问题,请参考以下文章

DioError [DioErrorType.RESPONSE]: Http 状态错误 [405] [已解决]

Flutter:DioError [DioErrorType.DEFAULT]:RangeError(索引):无效值:只有有效值为0:

错误:DioError [DioErrorType.other]:SocketException:主机查找失败:未被捕获

为啥颤振本地通知会出现异常

在颤振中调试时出现异常错误

颤振格式异常:意外字符(在字符 1 处)