3

checking some tutorials i try to make a Dart file that helps me to see if the user is still logged on firebase when opening the app and checks if there is a document with his UID to confirm if he finished the registration, here is the code

class Wrapper extends StatelessWidget{

 const Wrapper({super.key});

checkifuserfinishedregistratrion() async {
final FirebaseAuth auth = FirebaseAuth.instance;
final User? user = auth.currentUser;
if (user != null) {
  String uid = user.uid; // <-- User ID

      bool documentCustomerExists =
      await DatabaseMethods().documentDBCustomerExist(uid);
  if (documentCustomerExists) {
    clientExist = true;
  } else {
    clientExist = false;
  }

bool documentStoreExists = await DatabaseMethods().documentDBStoreExist(uid);
  if (documentStoreExists) {
    storeExist = true;
  } else {
    storeExist = false;
  }
}
}

@override
Widget build(BuildContext context) {
return Scaffold(
  body: StreamBuilder(
    stream: FirebaseAuth.instance.authStateChanges(),
    builder: (context, snapshot) {
      if (snapshot.connectionState == ConnectionState.waiting) {
        return const Center(
          child: CircularProgressIndicator(),
        );
      } else if (snapshot.hasError) {
        return Center(
          child: Text("Error"),
        );
      } else {
        if (snapshot.data == null) {
          return const LogInSession();
        } else {
          checkifuserfinishedregistratrion()
          if (customerExist == true && storeExist == false) {
            return const MainMenuCustomer();
          } else if (customerExist == false && storeExist == true) {
            return const MainMenuStore();
          } else {
            return const RegistrationPage();
          }
        }
      }
    },
  ),
);
   }
   }

The problem that i saw when doing breakpoints is that something happens on the method DatabaseMethods().documentDBStoreExist(uid) because it just skips that part

  Future<bool> documentDBStoreExist(String id) async {
DocumentSnapshot<Map<String, dynamic>> document = await FirebaseFirestore
    .instance
    .collection("StoreData")
    .doc(id)
    .get();

if (document.exists) {
  return true;
} else {
  return false;
}
  }

Also the console sends a very long log that what i read and seems important is:

W/ProviderInstaller( 9421): Failed to report request stats: com.google.android.gms.common.security.ProviderInstallerImpl.reportRequestStats [class android.content.Context, long, long]

E/GoogleApiManager( 9421): Failed to get service from broker.

I am new on Flutter but i have some experience with C# and Visual Studio and from what i see is that maybe i am trying to access the firestore database early and i am missing something to let me the access, is not the rules because i can already create, edit and get the UID.

Any help will be aprreciated

1 Answer 1

1

Convert Wrapper class into a statefulWidget and call checkIfUserFinishedRegistration(); within initState() method.

@override
  void initState() {
    super.initState();
    checkIfUserFinishedRegistration();
  }

Also update checkifuserfinishedregistratrion()

    checkifuserfinishedregistratrion() async {
    final FirebaseAuth auth = FirebaseAuth.instance;
    final User? user = auth.currentUser;
    if (user != null) {
      String uid = user.uid;
    
          bool documentCustomerExists =
          await DatabaseMethods().documentDBCustomerExist(uid);
      if (documentCustomerExists) {
        clientExist = true;
      } else {
        clientExist = false;
      }
    
    bool documentStoreExists = await DatabaseMethods().documentDBStoreExist(uid);
      if (documentStoreExists) {
        storeExist = true;
      } else {
        storeExist = false;
      }
        setState(() {}); //add for rebuild
    }
    }

Update StreamBuilder

StreamBuilder(
        stream: FirebaseAuth.instance.authStateChanges(),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return const Center(child: CircularProgressIndicator());
          } else if (snapshot.hasError) {
            return const Center(child: Text("Error"));
          } else {
            if (snapshot.data == null) {
              return const LogInSession();
            } else {
              if (customerExist && !storeExist) {
                return const MainMenuCustomer();
              } else if (!customerExist && storeExist) {
                return const MainMenuStore();
              } else {
                return const RegistrationPage();
              }
            }
          }
        },
      ),
1
  • 1
    Thank you so much for the help i made another approach by adding the methods apart and making a delay to let the app to take que UID before passing the search document method Commented Dec 9 at 22:17

Not the answer you're looking for? Browse other questions tagged or ask your own question.