android Firestore 回调不工作

android callback with firestore not working

我正在尝试从 firestore 获取数据,我想在执行其余代码之前获取数据,所以我使用了回调 起初我创建了一个 class DbManger,它有一个静态方法和一个接口

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) ;
    }

}

在另一个 activity 中,我试图在 DbManager class 的帮助下获取数据,就像那样

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());

但我没有得到任何数据

问题是您的 if(accountType.equals(Keys.ADMIN_ACCOUNT_TYPE_KEY))accountType=field 之前运行。查看此内容的最简单方法是添加一些日志记录,或在调试器中的这些行和 运行 上设置断点。

这个问题的解决方案总是相同的:需要数据的代码需要在数据可用后调用的回调中。所以最简单的解决方法是:

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());
        }
    });
}

另见: