Json 错误:未处理的异常:类型'_内部链接dhashmap<;字符串,动态>';不是类型为';int';飘飘然

Json 错误:未处理的异常:类型'_内部链接dhashmap<;字符串,动态>';不是类型为';int';飘飘然,json,flutter,dart,Json,Flutter,Dart,我不熟悉flift,尝试验证用户身份,但即使在终端中接收到响应状态为200,我也会遇到错误,因此我无法导航到授权页面 请问有人能帮我吗 登录屏幕代码: import 'package:celer_pesquisa_app/constantes.dart'; import 'package:celer_pesquisa_app/services/login_api.dart'; import 'package:celer_pesquisa_app/telas/recuperar_senha_tel

我不熟悉flift,尝试验证用户身份,但即使在终端中接收到响应状态为200,我也会遇到错误,因此我无法导航到授权页面

请问有人能帮我吗

登录屏幕代码:

import 'package:celer_pesquisa_app/constantes.dart';
import 'package:celer_pesquisa_app/services/login_api.dart';
import 'package:celer_pesquisa_app/telas/recuperar_senha_tela.dart';
import 'package:celer_pesquisa_app/telas/iniciar_quiz_tela.dart';
import 'package:celer_pesquisa_app/utilidades/alert.dart';
import 'package:flutter/material.dart';

class LoginTela extends StatefulWidget {
  static const String id = 'login_tela';

  @override
  _LoginTelaState createState() => _LoginTelaState();
}

class _LoginTelaState extends State<LoginTela> {
  String email;
  String password;
  final _ctrlLogin = TextEditingController();
  final _ctrlSenha = TextEditingController();
  final _formKey = GlobalKey<FormState>();

  _textFormField(
    String label,
    String hint, {
    bool senha = false,
    TextEditingController controller,
    FormFieldValidator<String> validator,
  }) {
    return TextFormField(
      style: kTextCorEscuro,
      controller: controller,
      validator: validator,
      obscureText: senha,
      decoration: InputDecoration(
          labelText: label,
          labelStyle: TextStyle(
            color: kButtonCor2,
          ),
          hintText: hint,
          contentPadding:
              EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0),
          border: OutlineInputBorder(
            borderRadius: BorderRadius.all(Radius.circular(32.0)),
          ),
          enabledBorder: OutlineInputBorder(
            borderSide: BorderSide(color: kButtonCor1, width: 1.0),
            borderRadius: BorderRadius.all(Radius.circular(32.0)),
          ),
          focusedBorder: OutlineInputBorder(
            borderSide: BorderSide(color: kButtonCor1, width: 2.0),
            borderRadius: BorderRadius.all(Radius.circular(32.0)),
          )),
    );
  }

  String _validaLogin(String texto) {
    if (texto.isEmpty) {
      return 'Digite o email';
    }
    if (texto.length < 3) {
      return 'Email muito curto, insira novamente!';
    }
    return null;
  }

  String _validaSenha(String texto) {
    if (texto.isEmpty) {
      return "Digite o senha";
    }
    return null;
  }

  void _clickButton(BuildContext context) async {
    bool formOk = _formKey.currentState.validate();

    if (!formOk) {
      return;
    }

    String login = _ctrlLogin.text;
    String senha = _ctrlSenha.text;

    print('login: $login senha: $senha');

    var user = await LoginApi.login(login, senha);

    if (user != null) {
      //print('==> $user');
      _navegaQuizStart(context);
    } else {
      alert(context, "Login Inválido!");
    }
  }

  _navegaQuizStart(BuildContext context) {
    Navigator.pushNamed(context, IniciarQuiz.id);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.white,
        elevation: 0,
        leading: FlatButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: Icon(
            Icons.arrow_back_ios,
            size: 50.0,
            color: kButtonCor2,
          ),
        ),
      ),
      backgroundColor: Colors.white,
      body: Form(
        key: _formKey,
        child: ListView(children: [
          Padding(
            padding: EdgeInsets.symmetric(horizontal: 24.0),
            child: SafeArea(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  SizedBox(
                    height: 48.0,
                  ),
                  _textFormField('Login', 'Digite o email',
                      controller: _ctrlLogin, validator: _validaLogin),
                  SizedBox(
                    height: 8.0,
                  ),
                  _textFormField('Senha', 'Digite a senha',
                      senha: true,
                      controller: _ctrlSenha,
                      validator: _validaSenha),
                  SizedBox(
                    height: 24.0,
                  ),
                  Padding(
                    padding: EdgeInsets.symmetric(vertical: 16.0),
                    child: Material(
                      color: kButtonCor1,
                      borderRadius: BorderRadius.all(Radius.circular(30.0)),
                      elevation: 5.0,
                      child: MaterialButton(
                        onPressed: () {
                          _clickButton(context);
                        },
                        minWidth: 200.0,
                        height: 42.0,
                        child: Text(
                          'Entrar',
                          style: kTextCorClaro,
                        ),
                      ),
                    ),
                  ),
                  Padding(
                    padding: EdgeInsets.symmetric(vertical: 16.0),
                    child: Material(
                      color: kButtonCor2,
                      borderRadius: BorderRadius.circular(30.0),
                      elevation: 5.0,
                      child: MaterialButton(
                        onPressed: () {
                          Navigator.pushNamed(context, RecuperarSenhaTela.id);
                        },
                        minWidth: 200.0,
                        height: 42.0,
                        child: Text(
                          'Esqueci a Senha',
                          style: kTextCorClaro,
                        ),
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ),
        ]),
      ),
    );
  }
}
import'软件包:celer_pesquisa_app/constants.dart';
导入“package:celer_pesquisa_app/services/login_api.dart”;
导入“软件包:celer_pesquisa_app/telas/recurperar_senha_tela.dart”;
导入“软件包:celer_pesquisa_app/telas/iniciar_quick_tela.dart”;
导入“package:celer_pesquisa_app/utilidades/alert.dart”;
进口“包装:颤振/材料.省道”;
类LoginTela扩展StatefulWidget{
静态常量字符串id='login_tela';
@凌驾
_LoginLastate createState()=>\u LoginLastate();
}
类_LoginTelaState扩展状态{
字符串电子邮件;
字符串密码;
final _ctrlLogin=TextEditingController();
final _ctrlSenha=文本编辑控制器();
final _formKey=GlobalKey();
_textFormField(
字符串标签,
字符串提示{
bool senha=false,
文本编辑控制器,
FormFieldValidator验证程序,
}) {
返回TextFormField(
风格:KTextCorescro,
控制器:控制器,
验证器:验证器,
蒙蔽文字:森哈,
装饰:输入装饰(
标签文本:标签,
标签样式:文本样式(
颜色:kButtonCor2,
),
提示:,
内容填充:
边缘组。对称(垂直:10.0,水平:20.0),
边框:大纲输入边框(
borderRadius:borderRadius.all(半径.圆形(32.0)),
),
enabledBorder:OutlineInputBorder(
borderSide:borderSide(颜色:kButtonCor1,宽度:1.0),
borderRadius:borderRadius.all(半径.圆形(32.0)),
),
聚焦顺序:大纲输入边框(
borderSide:borderSide(颜色:kButtonCor1,宽度:2.0),
borderRadius:borderRadius.all(半径.圆形(32.0)),
)),
);
}
字符串_validaLogin(字符串文本){
如果(文本isEmpty){
返回“Digite o email”;
}
如果(文本长度<3){
返回“电子邮件muito curto,insira Novatemente!”;
}
返回null;
}
字符串_validaSenha(字符串文本){
如果(文本isEmpty){
返回“Digite o senha”;
}
返回null;
}
void\u clickButton(BuildContext上下文)异步{
bool formOk=_formKey.currentState.validate();
如果(!formOk){
返回;
}
字符串login=\u ctrlLogin.text;
字符串senha=_ctrlSenha.text;
打印('login:$login senha:$senha');
var user=wait LoginApi.login(login,senha);
如果(用户!=null){
//打印('=>$user');
_navegaQuizStart(上下文);
}否则{
警报(上下文,“登录Inválido!”);
}
}
_navegaQuizStart(构建上下文){
Navigator.pushNamed(上下文,iniciarquick.id);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
背景颜色:Colors.white,
海拔:0,
引导:扁平按钮(
已按下:(){
Navigator.pop(上下文);
},
子:图标(
Icons.arrow\u back\u ios,
尺寸:50.0,
颜色:kButtonCor2,
),
),
),
背景颜色:Colors.white,
正文:表格(
键:_formKey,
子项:列表视图(子项:[
填充物(
填充:边缘组。对称(水平:24.0),
儿童:安全区(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
大小盒子(
身高:48.0,
),
_textFormField('Login'、'Digite o email',
控制器:_ctrlLogin,验证器:_validaLogin),
大小盒子(
身高:8.0,
),
_textFormField('Senha','Digite a Senha',
森哈:没错,
控制员:_ctrlSenha,
验证人:_validaSenha),
大小盒子(
身高:24.0,
),
填充物(
填充:边缘组。对称(垂直:16.0),
儿童:材料(
颜色:kButtonCor1,
borderRadius:borderRadius.all(半径.圆形(30.0)),
标高:5.0,
子:材质按钮(
已按下:(){
_单击按钮(上下文);
},
最小宽度:200.0,
身高:42.0,
子:文本(
“诱捕者”,
风格:kTextCorClaro,
),
),
),
),
填充物(
填充:边缘组。对称(垂直:16.0),
儿童:材料(
颜色:kButtonCor2,
边界半径:边界半径。圆形(30.0),
标高:5.0,
子:材质按钮(
已按下:(){
Navigator.pushNamed(上下文,recurperanhatela.id);
},
最小宽度:200.0,
身高:42.0,
子:文本(
“Esqueci a Senha”,
风格:kTextCorClaro,
),
),
),
),
],
),
),
),
]),
),
);
}
}
登录api代码
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:celer_pesquisa_app/services/user_info.dart';

class LoginApi {
  static Future<UserInfo> login(String username, String password) async {
    final baseUrl = 'https://iopoc.celer.ind.br:8080/api/v1/';

    var url = '$baseUrl/auth/user/login/';

    //Content-Type
    var header = {
      "Content-Type": "application/json",
      "Authorization": "Token <TOKEN>"
    };
    //Body
    Map params = {"username": username, "password": password};

    var userInfo;

    
    var _body = json.encode(params);

    var response = await http.post(url, headers: header, body: _body);

    print('Response status: ${response.statusCode}');
    //print('Response body: ${response.body}');

    Map mapResponse = json.decode(response.body);
    if (response.statusCode == 200)

      userInfo = UserInfo.fromJson(mapResponse);
    } else {
      userInfo = null;
    }
    return userInfo;
  }
}
class UserInfo {
  UserInfo({
    this.user,
    this.token,
  });

  User user;
  String token;

  factory UserInfo.fromRawJson(String str) =>
      UserInfo.fromJson(json.decode(str));

  String toRawJson() => json.encode(toJson());

  factory UserInfo.fromJson(Map<String, dynamic> json) => UserInfo(
        user: User.fromJson(json["user"]),
        token: json["token"],
      );

  Map<String, dynamic> toJson() => {
        "user": user.toJson(),
        "token": token,
      };

  String toString() {
    return 'User(token: $token, user: $user )';
  }
}

class User {
  User({
    this.id,
    this.fullName,
    this.email,
    this.profile,
    this.phones,
    this.company,
    this.tads,
    this.createDate,
    this.createUser,
    this.lastUpdateDate,
    this.lastUpdateUser,
    this.isActive,
  });

  int id;
  String fullName;
  String email;
  String profile;
  List<Phone> phones;
  Company company;
  List<dynamic> tads;
  DateTime createDate;
  AteUser createUser;
  DateTime lastUpdateDate;
  AteUser lastUpdateUser;
  bool isActive;

  factory User.fromRawJson(String str) => User.fromJson(json.decode(str));

  String toRawJson() => json.encode(toJson());

  factory User.fromJson(Map<String, dynamic> json) => User(
        id: json["id"],
        fullName: json["fullName"],
        email: json["email"],
        profile: json["profile"],
        phones: List<Phone>.from(json["phones"].map((x) => Phone.fromJson(x))),
        company: Company.fromJson(json["company"]),
        tads: List<dynamic>.from(json["tads"].map((x) => x)),
        createDate: DateTime.parse(json["createDate"]),
        createUser: AteUser.fromJson(json["createUser"]),
        lastUpdateDate: DateTime.parse(json["lastUpdateDate"]),
        lastUpdateUser: AteUser.fromJson(json["lastUpdateUser"]),
        isActive: json["isActive"],
      );

  Map<String, dynamic> toJson() => {
        "id": id,
        "fullName": fullName,
        "email": email,
        "profile": profile,
        "phones": List<dynamic>.from(phones.map((x) => x.toJson())),
        "company": company.toJson(),
        "tads": List<dynamic>.from(tads.map((x) => x)),
        "createDate": createDate.toIso8601String(),
        "createUser": createUser.toJson(),
        "lastUpdateDate": lastUpdateDate.toIso8601String(),
        "lastUpdateUser": lastUpdateUser.toJson(),
        "isActive": isActive,
      };
}

class Company {
  Company({
    this.id,
    this.name,
    this.cnpj,
    this.email,
    this.responsibleName,
    this.responsibleEmail,
    this.responsiblePhone,
    this.street,
    this.number,
    this.complement,
    this.neighborhood,
    this.city,
    this.state,
    this.country,
    this.zipcode,
    this.phones,
    this.branch,
    this.createDate,
    this.createUser,
    this.lastUpdateDate,
    this.lastUpdateUser,
    this.isActive,
  });

  int id;
  String name;
  String cnpj;
  String email;
  String responsibleName;
  String responsibleEmail;
  String responsiblePhone;
  dynamic street;
  dynamic number;
  dynamic complement;
  dynamic neighborhood;
  dynamic city;
  dynamic state;
  dynamic country;
  dynamic zipcode;
  List<dynamic> phones;
  dynamic branch;
  DateTime createDate;
  AteUser createUser;
  DateTime lastUpdateDate;
  AteUser lastUpdateUser;
  bool isActive;

  factory Company.fromRawJson(String str) => Company.fromJson(json.decode(str));

  String toRawJson() => json.encode(toJson());

  factory Company.fromJson(Map<String, dynamic> json) => Company(
        id: json["id"],
        name: json["name"],
        cnpj: json["cnpj"],
        email: json["email"],
        responsibleName: json["responsibleName"],
        responsibleEmail: json["responsibleEmail"],
        responsiblePhone: json["responsiblePhone"],
        street: json["street"],
        number: json["number"],
        complement: json["complement"],
        neighborhood: json["neighborhood"],
        city: json["city"],
        state: json["state"],
        country: json["country"],
        zipcode: json["zipcode"],
        phones: List<dynamic>.from(json["phones"].map((x) => x)),
        branch: json["branch"],
        createDate: DateTime.parse(json["createDate"]),
        createUser: AteUser.fromJson(json["createUser"]),
        lastUpdateDate: DateTime.parse(json["lastUpdateDate"]),
        lastUpdateUser: AteUser.fromJson(json["lastUpdateUser"]),
        isActive: json["isActive"],
      );

  Map<String, dynamic> toJson() => {
        "id": id,
        "name": name,
        "cnpj": cnpj,
        "email": email,
        "responsibleName": responsibleName,
        "responsibleEmail": responsibleEmail,
        "responsiblePhone": responsiblePhone,
        "street": street,
        "number": number,
        "complement": complement,
        "neighborhood": neighborhood,
        "city": city,
        "state": state,
        "country": country,
        "zipcode": zipcode,
        "phones": List<dynamic>.from(phones.map((x) => x)),
        "branch": branch,
        "createDate": createDate.toIso8601String(),
        "createUser": createUser.toJson(),
        "lastUpdateDate": lastUpdateDate.toIso8601String(),
        "lastUpdateUser": lastUpdateUser.toJson(),
        "isActive": isActive,
      };
}

class AteUser {
  AteUser({
    this.id,
    this.createDate,
    this.lastUpdateDate,
    this.isActive,
    this.fullName,
    this.profile,
    this.createUser,
    this.lastUpdateUser,
    this.user,
    this.company,
    this.tads,
    this.email,
  });

  int id;
  DateTime createDate;
  DateTime lastUpdateDate;
  bool isActive;
  String fullName;
  String profile;
  int createUser;
  int lastUpdateUser;
  int user;
  int company;
  List<dynamic> tads;
  String email;

  factory AteUser.fromRawJson(String str) => AteUser.fromJson(json.decode(str));

  String toRawJson() => json.encode(toJson());

  factory AteUser.fromJson(Map<String, dynamic> json) => AteUser(
        id: json["id"],
        createDate: DateTime.parse(json["createDate"]),
        lastUpdateDate: DateTime.parse(json["lastUpdateDate"]),
        isActive: json["isActive"],
        fullName: json["fullName"],
        profile: json["profile"],
        createUser: json["createUser"],
        lastUpdateUser: json["lastUpdateUser"],
        user: json["user"],
        company: json["company"] == null ? null : json["company"],
        tads: List<dynamic>.from(json["tads"].map((x) => x)),
        email: json["email"] == null ? null : json["email"],
      );

  Map<String, dynamic> toJson() => {
        "id": id,
        "createDate": createDate.toIso8601String(),
        "lastUpdateDate": lastUpdateDate.toIso8601String(),
        "isActive": isActive,
        "fullName": fullName,
        "profile": profile,
        "createUser": createUser,
        "lastUpdateUser": lastUpdateUser,
        "user": user,
        "company": company == null ? null : company,
        "tads": List<dynamic>.from(tads.map((x) => x)),
        "email": email == null ? null : email,
      };
}

class Phone {
  Phone({
    this.phone,
    this.description,
  });

  String phone;
  String description;

  factory Phone.fromRawJson(String str) => Phone.fromJson(json.decode(str));

  String toRawJson() => json.encode(toJson());

  factory Phone.fromJson(Map<String, dynamic> json) => Phone(
        phone: json["phone"],
        description: json["description"],
      );

  Map<String, dynamic> toJson() => {
        "phone": phone,
        "description": description,
      };
}