While trying to retreive authentication data from firebase, I am facing the error : The getter 'email' was called on null. Receiver: null Tried calling: email
even if this is no error in my code.
when the user sign in he will be redirected to home page:
Here is the code i am using home.dart (in which there is sidebar):
import 'package:flutter/material.dart';
import 'package:testa/bloc/navigation_bloc/navigation_bloc.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:testa/sidebar/sidebar.dart';
import 'package:testa/sidebar/sidebar_layout.dart';
class HomePage extends StatelessWidget with NavigationStates {
const HomePage({Key key,@required this.user}) : super(key: key);
final FirebaseUser user;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home ${user.email}'),
),
body: StreamBuilder<DocumentSnapshot>(
stream: Firestore.instance
.collection('/users')
.document(user.uid)
.snapshots(),
builder:
(BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else if (snapshot.hasData) {
return checkRole(snapshot.data);
}
return LinearProgressIndicator();
},
),
);
}
Center checkRole(DocumentSnapshot snapshot) {
if (snapshot.data == null) {
return Center(
child: Text('no data set in the userId document in firestore'),
);
}
if (snapshot.data['role'] == 'admin') {
return adminPage(snapshot);
} else {
return userPage(snapshot);
}
}
Center adminPage(DocumentSnapshot snapshot) {
return Center(
child: Text('${snapshot.data['role']} ${snapshot.data['name']}'));
}
Center userPage(DocumentSnapshot snapshot) {
return Center(child: Text(snapshot.data['name']));
}
}
Here is the code of sign_in.dart if it might help even if it seems there is no issue there
import 'package:firebase_auth/firebase_auth.dart';
import 'package:testa/pages/home.dart';
import 'package:flutter/material.dart';
import 'package:testa/sidebar/sidebar_layout.dart';
import 'package:testa/sidebar/sidebar.dart';
class LoginPage extends StatefulWidget {
@override
_LoginPageState createState() => new _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
String _email, _password;
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(),
body: Form(
key: _formKey,
child: Column(
children: <Widget>[
TextFormField(
validator: (input) {
if(input.isEmpty){
return 'Provide an email';
}
},
decoration: InputDecoration(
labelText: 'Email'
),
onSaved: (input) => _email = input,
),
TextFormField(
validator: (input) {
if(input.length < 6){
return 'Longer password please';
}
},
decoration: InputDecoration(
labelText: 'Password'
),
onSaved: (input) => _password = input,
obscureText: true,
),
RaisedButton(
onPressed: signIn,
child: Text('Sign in'),
),
],
)
),
);
}
void signIn() async {
if(_formKey.currentState.validate()){
_formKey.currentState.save();
try{
FirebaseUser user = (await FirebaseAuth.instance.signInWithEmailAndPassword(email: _email, password: _password)).user;
Navigator.push(context, MaterialPageRoute(builder: (context) => SideBarLayout(user: user)));
}catch(e){
print(e.message);
}
}
}
}
when i change SideBarLayout by HomePage, it works fine, otherwise, i have an error under the first 'user' (context) => HomePage(user: user,))); and it says (the named parameter 'user' is not defined
void signIn() async {
if(_formKey.currentState.validate()){
_formKey.currentState.save();
try{
FirebaseUser user = (await FirebaseAuth.instance.signInWithEmailAndPassword(email: _email, password: _password)).user;
Navigator.push(context, MaterialPageRoute(builder: (context) => HomePage(user: user,)));
}catch(e){
print(e.message);
}
}
}
SideBarLayout.dart code:
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'sidebar.dart';
import 'package:testa/bloc/navigation_bloc/navigation_bloc.dart';
class SideBarLayout extends StatelessWidget {
const SideBarLayout({Key key, this.user}) : super(key: key);
final FirebaseUser user;
@override
Widget build(BuildContext context) {
return Scaffold(
body: BlocProvider<NavigationBloc>(
create: (context) => NavigationBloc(),
child: Stack(
children: <Widget>[
BlocBuilder<NavigationBloc, NavigationStates> (
builder: (context, navigationState) {
return navigationState as Widget;
},
),
SideBar(),
],
),
),
);
}
}