I'm new to flutter and I try to make login Authentication with firebase Auth but return with "Error: NoSuchMethodError: The method 'login' was called on null."
loginPage:
import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_custom_clippers/flutter_custom_clippers.dart'; import 'package:topride/src/pages/login/login_controller.dart'; import 'package:topride/src/pages/register/register_controller.dart'; import 'package:topride/src/pages/register/register_page.dart'; import 'package:topride/src/widgets/button_app.dart'; class LoginPage extends StatefulWidget { @override _LoginPageState createState() => _LoginPageState(); } class _LoginPageState extends State<LoginPage> { LoginController _con = new LoginController(); @override void setState(VoidCallback fn) { // TODO: implement setState super.setState(fn); SchedulerBinding.instance.addPostFrameCallback((timeStamp) { _con.init(context); }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(), body: SingleChildScrollView( child: Column( children: [ _bannerApp(), _textDescription(), _textLogin(), SizedBox(height: MediaQuery.of(context).size.height*0.17,), _textFieldEmail(), _textFieldPassword(), _buttonLogin(), _textDontHaveAccount(), ], ), ), ); } Widget _bannerApp(){ return ClipPath( clipper: WaveClipperTwo(), child: Container( color: Colors.black54, height: MediaQuery.of(context).size.height*0.22, child: Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Image.asset( 'assets/img/logo_app.png', width: 150, height: 100, ), Text( 'Facile et Rapide', style: TextStyle( fontFamily: 'Racing', fontSize: 22, fontWeight: FontWeight.w700, color: Colors.white ), ), ], ), ), ); } Widget _textDescription(){ return Container( alignment: Alignment.centerLeft, margin: EdgeInsets.symmetric(horizontal: 30,vertical: 10), child: Text('Continuez avec votre', style: TextStyle( color: Colors.black54, fontSize: 20, fontFamily: 'Nimbus' ), ), ); } Widget _textLogin(){ return Container( alignment: Alignment.centerLeft, margin: EdgeInsets.symmetric(horizontal: 30), child: Text('Login', style: TextStyle( color: Colors.black, fontWeight: FontWeight.bold, fontSize: 28, ), ), ); } Widget _textFieldEmail(){ return Container( margin: EdgeInsets.symmetric(horizontal: 30,vertical: 10), child: TextField( controller: _con.emailController, decoration: InputDecoration( hintText: '[email protected]', labelText: 'Address E-mail', suffixIcon: Icon( Icons.email_outlined, color: Colors.black54, ), ), ), ); } Widget _textFieldPassword(){ return Container( margin: EdgeInsets.symmetric(horizontal: 30,vertical: 15), child: TextField( obscureText: true, controller: _con.passwordController, decoration: InputDecoration( labelText: 'Mot de Passe', suffixIcon: Icon( Icons.lock_clock_outlined, color: Colors.black54, ), ), ), ); } Widget _buttonLogin (){ return Container( margin: EdgeInsets.symmetric(horizontal: 30,vertical: 25), child: ButtonApp(onPressed:_con.login,text:'Connexion',)); } Widget _textDontHaveAccount(){ return TextButton(onPressed:() => navigateToRegister(context), child: Container( margin: EdgeInsets.only(bottom: 50), child: Text( 'Ne pas avoir de compte ? ', style: TextStyle( color: Colors.black54, fontSize: 15, ), ), ), ); } navigateToRegister(BuildContext context) { Navigator.of(context) .push(MaterialPageRoute<Null>(builder: (BuildContext context) { return RegisterPage(); })); } } loginController :
import 'package:flutter/material.dart'; import 'package:topride/src/providers/auth_provider.dart'; class LoginController{ BuildContext context; TextEditingController emailController = new TextEditingController(); TextEditingController passwordController = new TextEditingController(); AuthProvider _authProvider; Future init(BuildContext context){ this.context=context; _authProvider=new AuthProvider(); } void login()async{ String email = emailController.text.trim(); String password =passwordController.text.trim(); print('email: $email'); print('password: $password'); try{ bool isLogin= await _authProvider.login(email, password); if(isLogin){ print('the user is logged in '); } else{ print('the user is not login'); } }catch(error){ print('Error: $error'); } } } authProvider:
import 'package:firebase_auth/firebase_auth.dart'; class AuthProvider { FirebaseAuth _firebaseAuth; AuthProvider(){ _firebaseAuth = FirebaseAuth.instance; } Future<bool> login(String email ,String password)async{ String errorMessage; try{ await _firebaseAuth.signInWithEmailAndPassword(email: email, password: password); }catch(error){ print(error); //invalid email //incorrect password //no internet connection errorMessage=error.Code; } if(errorMessage!=null){ return Future.error(errorMessage); } return true; } } Run:
I/flutter (10810): email: [email protected] I/flutter (10810): password: 37503230 I/flutter (10810): Error: NoSuchMethodError: The method 'login' was called on null. I/flutter (10810): Receiver: null I/flutter (10810): Tried calling: login("[email protected]", "37503230") I also add account on firebase wish the same email and password for test , please help this is driving me crazy