简体   繁体   中英

Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>

E/flutter ( 3391): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>'
E/flutter ( 3391): #0      new LoginResponseModel.fromJson (package:flutter_woocomerce/model/login_model.dart:21:53)
E/flutter ( 3391): #1      APIServices.loginCustomer (package:flutter_woocomerce/api_service.dart:63:36)
E/flutter ( 3391): <asynchronous suspension>
E/flutter ( 3391): #2      _LoginPageState._uiSetup.<anonymous closure> (package:flutter_woocomerce/pages/login_page.dart:137:36)
E/flutter ( 3391): #3      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:993:19)
E/flutter ( 3391): #4      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:1111:38)
E/flutter ( 3391): #5      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:183:24)
E/flutter ( 3391): #6      TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:598:11)
E/flutter ( 3391): #7      BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:287:5)
E/flutter ( 3391): #8      BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:222:7)
E/flutter ( 3391): #9      PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:476:9)
E/flutter ( 3391): #10     PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:77:12)
E/flutter ( 3391): #11     PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:122:9)
E/flutter ( 3391): #12     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:377:8)
E/flutter ( 3391): #13     PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:120:18)
E/flutter ( 3391): #14     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:106:7)
E/flutter ( 3391): #15     GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:358:19)
E/flutter ( 3391): #16     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:338:22)
E/flutter ( 3391): #17     RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:267:11)
E/flutter ( 3391): #18     GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:295:7)
E/flutter ( 3391): #19     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:240:7)
E/flutter ( 3391): #20     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:213:7)
E/flutter ( 3391): #21     _rootRunUnary (dart:async/zone.dart:1206:13)
E/flutter ( 3391): #22     _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter ( 3391): #23     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter ( 3391): #24     _invoke1 (dart:ui/hooks.dart:265:10)
E/flutter ( 3391): #25     _dispatchPointerDataPacket (dart:ui/hooks.dart:174:5)
E/flutter ( 3391): mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

//login model

class LoginResponseModel {
  bool success;
  int statusCode;
  String code;
  String message;
  Data data;

  LoginResponseModel({
    this.success,
    this.statusCode,
    this.code,
    this.message,
    this.data,
  });

  LoginResponseModel.fromJson(Map<String, dynamic> json) {
    success = json['success'];
    statusCode = json['statusCode'];
    code = json['code'];
    message = json['message'];
    data = json['data'] != null ? Data.fromJson(json['data']) : null;
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = Map<String, dynamic>();
    data['success'] = this.success;
    data['statusCode'] = this.statusCode;
    data['code'] = this.code;
    data['message'] = this.message;

    if (this.data != null) {
      data['data'] = this.data.toJson() ;
    }
    return data;
  }
}

class Data {
  String token;
  int id;
  String email;
  String niceName;
  String firstName;
  String lastName;
  String displayName;

  Data({
    this.token,
    this.id,
    this.email,
    this.niceName,
    this.firstName,
    this.lastName,
    this.displayName,
  });

  Data.fromJson(Map<String, dynamic> json) {
    token = json['token'];
    id = json['id'];
    email = json['email'];
    niceName = json['niceName'];
    firstName = json['firstName'];
    lastName = json['lastName'];
    displayName = json['displayName'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = Map<String, dynamic>();
    data['token'] = this.token;
    data['id'] = this.id;
    data['email'] = this.email;
    data['niceName'] = this.niceName;
    data['firstName'] = this.firstName;
    data['lastName'] = this.lastName;
    data['displayName'] = this.displayName;

    return data;
  }
}

api services

import 'dart:convert';
import 'dart:io';

import 'package:dio/dio.dart';
import 'package:flutter_woocomerce/config.dart';
import 'package:flutter_woocomerce/model/customer.dart';
import 'package:flutter_woocomerce/model/login_model.dart';

class APIServices {
  Future<bool> createCustomer(CustomerModel) async {
    var authToken =
    base64.encode(utf8.encode(Config.key + ':' + Config.secret));
    bool ret = false;

    try {
      var response = await Dio().post(
          Config.url + Config.customerURL,
          data: CustomerModel.toJson(),
          options: Options(
              headers: {
                HttpHeaders.authorizationHeader: 'Basic $authToken',
                HttpHeaders.contentTypeHeader: 'application/json',

              }
          )

      );
      if (response.statusCode == 201) {
        ret = true;
      }
    } on DioError catch (e) {
      if (e.response.statusCode == 404) {
        ret = false;
      } else {
        ret = false;
      }
    }
    return ret;
  }


  Future<LoginResponseModel> loginCustomer(String username,
      String password) async {
    LoginResponseModel model;

    try {
      var response = await Dio().post(
          Config.tokenURL,
          data: {
            "username": username,
            "password": password,
          },
          options: Options(
              headers: {
                HttpHeaders
                    .contentTypeHeader: 'application/x-www-form-urlencoded',

              }
          )

      );
      if (response.statusCode == 200) {
        model = LoginResponseModel.fromJson(response.data);
      }
    } on DioError catch (e) {
      print(e.message);
    }
    return model;
  }


}

my code in github

From the "error" that shows you, the response type is a List<dynamic> . In LoginResponseModel.fromJson method debugPrint your response and check and make sure its type is Map<String, dynamic> .

The response that you updated in the comment above, shows that the value of data in the response is an array.

In your code here:

LoginResponseModel.fromJson(Map<String, dynamic> json) {
    success = json['success'];
    statusCode = json['statusCode'];
    code = json['code'];
    message = json['message'];
    data = json['data'] != null ? Data.fromJson(json['data']) : null;
  }

This line:

data = json['data'] != null ? Data.fromJson(json['data']) : null;

Solution:

You are trying to convert the array data into a Data object, while you actually need parse it into a List , like this:

data = json['data'] != null ? List<dynamic>.from(json["data"]) : null;

OR

if the List is of Data objects then:

data = json['data'] != null ? List<Data>.from(json["data"].map((x) => Data.fromJson(x))) : null;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM