emmaakachukwu
emmaakachukwu

Reputation: 127

Using Flutter ChangeNotifierProvider for authentication

I am using ChangeNotifierProvider to handle app state for my flutter app.

My main.dart file

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:flutter_app/services/auth.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<AuthService>(
        create: (context) => AuthService(), // initializes auth.dart file here
        child: MaterialApp(
          initialRoute: '/',
          onGenerateRoute: RouteGenerator.generateRoute,
          debugShowCheckedModeBanner: false,
          title: '...',
          home: WelcomeScreen(),
        ));
  }
}

I am trying to change the value of the uid field here in auth.dart

auth.dart file

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';

class AuthService with ChangeNotifier {
  final FirebaseAuth _auth = FirebaseAuth.instance;

  String uid = ""; //initial value of uid

  UserM _userFromFirebaseUser(User user) {
    return user != null ? UserM(uid: user.uid) : null;
  }

  Stream<UserM> get user {
    return null;
  }

  Future signInWithEmail(String email, String password) async {
    try {
      UserCredential result = await _auth.signInWithEmailAndPassword(
          email: email, password: password);
      User user = result.user;
      uid = user.uid; //trying to change uid here
      print('user id: $uid'); //new value is printed here
      notifyListeners();
      return _userFromFirebaseUser(user);
    } catch (e) {
      print(e.toString());
      return null;
    }
  }

uid changes but then when i try to get the new value in another file, i still get the old value which is the empty string declared on top. This is how i am trying to access it

final auth = Provider.of<AuthService>(context, listen: true).uid;
print(auth);

What am I doing wrong please?

Upvotes: 3

Views: 951

Answers (1)

CoderUni
CoderUni

Reputation: 6164

I don't get why there is a need to use Provider to get the uid of a user in Firebase. You can get the uid synchronously by doing currentUser.uid.
Here is an example:

print(FirebaseAuth.instance.currentUser.uid);

Upvotes: 2

Related Questions