Home > Enterprise >  Flutter unable to login after create new account
Flutter unable to login after create new account

Time:04-05

After building the app, if I try to login it's working fine, but if I create a new account then try to login again, login is not working. I have seen after debugging that I'm getting token in _authenticate method. I think notifyListeners not working here but I don't know why?

I'm using the provider package in my flutter app. I have an Auth provider class where I'm saving data in firebase and also login by firebase. Below it's my provider class.

class Auth with ChangeNotifier {

    String? _token;
    late DateTime _expiryDate = DateTime.now();
    late String _userId;
    
    bool get isAuth {
        return token != null;
    }

    String? get token {
        if ((_expiryDate).isAfter(DateTime.now())) {
            return _token;
        }
        return null;
    }
    
    Future _authenticate(String email, String password, String urlSegment) async {
        var urlParse = Uri.parse(urlSegment);

        try {
            final response = await http.post(urlParse,
                body: jsonEncode({
                    'email': email,
                    'password': password,
                    'returnSecureToken': true
                })
            );
            final responseData = jsonDecode(response.body);

            if (responseData['error'] != null) {
                throw HttpException(responseData['error']['message']);
            }
            // set token and user id from firebase response
            _token = responseData['idToken'];
            _userId = responseData['localId'];
            _expiryDate = DateTime.now()
                .add(Duration(seconds: int.parse(responseData['expiresIn'])));
            notifyListeners();

            return responseData['idToken'];
            
        } catch (error) {
            rethrow;
        }
    }


    Future login(String email, String password) async {
        print(email);
        String url = Constants.firebaseLoginUrl;
        return _authenticate(email, password, url);
    }


    Future signup(String email, String password) async {
        String url = Constants.firebaseSignupUrl;
        return _authenticate(email, password, url);
    }

}

In signUp page I have tried below code to create a new user

Future<void> signUpSubmit() async {
        if (_formKey.currentState!.validate()) {
            
        await Provider.of<Auth>(context, listen: false).signup(_email.text, _pass.text);
}
            

I have checked new data is saving perfectly.

In signUp page there has a login button, after click on login button I have redirect in login page,

TextButton(
            onPressed: () {
                Navigator.push(
                        context,
                        MaterialPageRoute(
                            builder: (context) => const LoginPage()
                        ),
                );
            },
            child: const Text('Log in to access'),
)

After click on login I have redirect in login page, then tried login again but it's not working. In debug I'm getting token if I print(token) in _authenticate method.

In main.dart my consumer is looks like

child: Consumer<Auth>(
    builder: (ctx,auth, _) => MaterialApp(
    home: auth.isAuth ? const HomePage():const LoginPage(),
)

After create account if I rebuild app again then login is working? How I will solve this problem?

CodePudding user response:

See you are redirecting directly in loginPage rather than via the main page ! Just redirect the login button to main page, in your main page there has condition

home: auth.isAuth ?  const HomePage(): const LoginPage()

So, if it is auth false it will always redirect to the login page.

Change

MaterialPageRoute( builder: (context) => const LoginPage() ),

To

MaterialPageRoute( builder: (context) => const MainPage() ),
  • Related