Авторизация firebase flutter
Пытаюсь авторизовать пользователя в мобильном приложении flutter и получаю следующую ошибку:
(18558): Ignoring header X-Firebase-Locale because its value was null.
D/FirebaseAuth(18558): Notifying id token listeners about user ( zzMk216grBTgKQovp8drzPbA9YR2 ).
Регистрация вроде как проходит успешно, новые пользователи появляются добавляются в бд. Вот код
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:rick_and_morty/feature/domain/user.dart';
class AuthService{
final FirebaseAuth _fAuth = FirebaseAuth.instance;
Future signInWithEmailAndPassword(String email, String password) async {
try {
UserCredential result = await _fAuth.signInWithEmailAndPassword(email: email, password: password);
User user = result.user;
return UserC.fromFirebase(user);
} catch (e) {
print(e);
return null;
}
}
Future registerInWithEmailAndPassword(String email, String password) async {
try {
UserCredential result = await _fAuth.createUserWithEmailAndPassword(email: email, password: password);
User user = result.user;
return UserC.fromFirebase(user);
} catch (e) {
print(e);
return null;
}
}
Future logOut() async {
await _fAuth.signOut();
}
Stream<UserC> get currentUser{
return _fAuth.authStateChanges().map((User user) => user != null ? UserC.fromFirebase(user) : null);
}
}
Страница регистрации/ авторизации
import 'dart:ffi';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:rick_and_morty/auth.dart';
import 'package:rick_and_morty/feature/domain/user.dart';
class AuthorizationPage extends StatefulWidget {
AuthorizationPage({Key key}) : super(key: key);
@override
State<AuthorizationPage> createState() => _AuthorizationPageState();
}
class _AuthorizationPageState extends State<AuthorizationPage> {
TextEditingController _emailController = TextEditingController();
TextEditingController _passwordController = TextEditingController();
String _email;
String _password;
bool showLogin = true;
AuthService _authService = AuthService();
@override
Widget build(BuildContext context) {
Widget _logo() {
return Padding(
padding: EdgeInsets.only(top: 100),
child: Container(
child: Align(
child: Text('Rick and Morty',
style: TextStyle(
fontSize: 35,
fontWeight: FontWeight.bold,
color: Colors.white)),
),
),
);
}
Widget _input(Icon icon, String hint, TextEditingController controller,
bool obscure) {
return Container(
padding: EdgeInsets.only(left: 20, right: 20),
child: TextField(
controller: controller,
obscureText: obscure,
style: TextStyle(fontSize: 20, color: Colors.white),
decoration: InputDecoration(
hintStyle: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 20,
color: Colors.white30),
hintText: hint,
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.white, width: 3),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.white54, width: 1)),
prefixIcon: Padding(
padding: EdgeInsets.only(left: 10, right: 10),
child: IconTheme(
data: IconThemeData(color: Colors.white),
child: icon,
),
),
),
),
);
}
Widget _button(String text, void func()){
return RaisedButton(
splashColor: Theme.of(context).primaryColor,
highlightColor: Theme.of(context).primaryColor,
color: Colors.white,
child: Text(text, style: TextStyle(fontWeight: FontWeight.bold, color: Theme.of(context).primaryColor, fontSize: 20)
),
onPressed: (){
func();
},
);
}
Widget _form(String label, void func()) {
return Container(
child: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.only(bottom: 20, top: 10),
child: _input(
Icon(Icons.email), "EMAIL", _emailController, false)),
Padding(
padding: EdgeInsets.only(bottom: 20, top: 10),
child: _input(Icon(Icons.lock), "PASSWORD",
_passwordController, true)),
SizedBox(
height: 20,
),
Padding(
padding: EdgeInsets.only(left: 20, right: 20),
child: Container(
height: 50,
width: MediaQuery.of(context).size.width,
child: _button(label, func),
),
)
],
),
);
}
void _LoginButtonAction() async {
_email = _emailController.text;
_password = _passwordController.text;
if(_email.isEmpty || _password.isEmpty) return;
UserC user = await _authService.signInWithEmailAndPassword(_email.trim(), _password.trim());
if (user == null)
{
Fluttertoast.showToast(
msg: "Can't SignIn you! Please check your email/password",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
timeInSecForIosWeb: 1,
backgroundColor: Colors.red,
textColor: Colors.white,
fontSize: 16.0
);
} else{
_emailController.clear();
_passwordController.clear();
}
}
void _RegisterButtonAction() async {
_email = _emailController.text;
_password = _passwordController.text;
if(_email.isEmpty || _password.isEmpty) return;
UserC user = await _authService.registerInWithEmailAndPassword(_email.trim(), _password.trim());
if (user == null)
{
Fluttertoast.showToast(
msg: "Can't Register you! Please check your email/password",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
timeInSecForIosWeb: 1,
backgroundColor: Colors.red,
textColor: Colors.white,
fontSize: 16.0
);
} else{
_emailController.clear();
_passwordController.clear();
}
}
return Scaffold(
body: Column(
children: <Widget>[
_logo(),
SizedBox(height: 100,),
(
showLogin
? Column(
children: <Widget>[
_form('Login', _LoginButtonAction),
Padding(
padding: EdgeInsets.all(10),
child: GestureDetector(child: Text('Not registered yet? Register!', style: TextStyle(fontSize: 20, color: Colors.white)
),
onTap:() {
setState((){
showLogin = false;
});
}
),
)
],
)
: Column(
children: <Widget>[
_form('REGISTER', _RegisterButtonAction),
Padding(
padding: EdgeInsets.all(10),
child: GestureDetector(child: Text('Allready registered? Login!', style: TextStyle(fontSize: 20, color: Colors.white)
),
onTap:() {
setState((){
showLogin = true;
});
}
),
)
],
)
),
],
),
);
}
}