0

i'm trying to get data from firestore and i want to get data before executing the rest of the code so i used callbacks at first i created a class DbManger with a static methode and an interface

public class DbManager
{

    private static FirebaseFirestore db;
    private static FirebaseAuth auth;
    private static FirebaseUser currentUser;



    public static void getField(String uid,String key, FirebaseCallBack callBack) {
        db= FirebaseFirestore.getInstance();
        auth=FirebaseAuth.getInstance();
        currentUser = auth.getCurrentUser();

        db.collection(Keys.USERS_KEY).document(uid).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if (task.isSuccessful()) {
                    DocumentSnapshot documentSnapshot = task.getResult();
                String field = documentSnapshot.getString(key);
                callBack.onCallBack(field);
                }
            }
        });
    }

    public interface FirebaseCallBack
    {
         void onCallBack(String field) ;
    }

}

in the other activity i tried to get data with the help of the DbManager class like that

if(currentUser!=null){
        DbManager.getField(currentUser.getUid(), Keys.ACCOUNT_TYPE_KEY, new DbManager.FirebaseCallBack() {
            @Override
            public void onCallBack(String field) {
                accountType=field;
            }
        });
        
    }
if(accountType.equals(Keys.ADMIN_ACCOUNT_TYPE_KEY))
        selectFragment(new HomeFragment());
    else
        selectFragment(new ModulesFragment());

but i didn't get any data

  • Have a look [here](https://stackoverflow.com/questions/57330766/why-does-my-function-that-calls-an-api-return-an-empty-or-null-value) for some more info on the topic. – Tyler V Apr 19 '22 at 00:49

1 Answers1

1

The problem is that your if(accountType.equals(Keys.ADMIN_ACCOUNT_TYPE_KEY)) runs before accountType=field. The easiest way to see this is by adding some logging, or setting breakpoints on those line and running in the debugger.

The solution for this is always the same: the code that needs the data, needs to be in the callback that is invoked once the data is available. So the simplest fix for you is:

if(currentUser!=null){
    DbManager.getField(currentUser.getUid(), Keys.ACCOUNT_TYPE_KEY, new DbManager.FirebaseCallBack() {
        @Override
        public void onCallBack(String field) {
            accountType=field;
            if(accountType.equals(Keys.ADMIN_ACCOUNT_TYPE_KEY))
                selectFragment(new HomeFragment());
            else
                selectFragment(new ModulesFragment());
        }
    });
}

Also see:

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807