0
Hey, how you doing? I am still learning flutter and am having a problem authenticating the user. Even if I receive the status 200, I cannot navigate to the authorized page. I wonder if someone could help me?
Thanks in advance
Login screen:
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,
),
),
),
),
],
),
),
),
]),
),
);
}
}
Login-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;
}
}
Model
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,
};
}


You could edit your question and ask how the json template is coming
AteUser? By the looks of it, some of your fields are not coming as you expect.– Naslausky
Your problem is you’re trying to set a
Map<String, dynamic>to the property Ateuser.cmpany who’s kind Int. You need to create a classCompanyand do the same in other places company = Company.fromJson().– Matheus Ribeiro