You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Firestore集合取值存入变量?取值为null该如何解决?

问题根因

Firestore的addSnapshotListener是异步回调逻辑:你触发监听请求后,代码不会等待服务端返回结果,会直接向下执行你初始化storageReference的同步代码。这时候onEvent回调还没触发,year变量还没有被赋值,所以getYear()返回null。

解决方案

把所有需要用到year值的逻辑,全部放到onEvent回调内部,在setYear之后执行即可,修改后代码如下:

DocumentReference documentReference = fStore.collection("Users").document(userId);
documentReference.addSnapshotListener(this, new EventListener<DocumentSnapshot>() {
    @Override
    public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException error) {
        if (error != null){
            if (progressDialog.isShowing())
                progressDialog.dismiss();
            Log.e("Firestore error",error.getMessage());
            return;
        }
        assert value != null;
        String gyear = value.getString("Year");
        setYear(gyear);
        // 把storageReference初始化及后续拉取存储文件的逻辑移到这里
        storageReference = FirebaseStorage.getInstance().getReference("AcademicCalendar/"+getYear()+"/AC.jpg");
        // 后续处理storageReference的逻辑也写在这里
    }
});
优化建议

如果你只需要单次获取Year字段值,不需要监听字段的后续变化,建议用get()方法替代addSnapshotListener,避免不必要的持续监听开销:

documentReference.get().addOnCompleteListener(task -> {
    if (task.isSuccessful()) {
        DocumentSnapshot document = task.getResult();
        if (document.exists()) {
            String gyear = document.getString("Year");
            setYear(gyear);
            // 后续逻辑同上
            storageReference = FirebaseStorage.getInstance().getReference("AcademicCalendar/"+getYear()+"/AC.jpg");
        }
    } else {
        if (progressDialog.isShowing())
            progressDialog.dismiss();
        Log.e("Firestore error", task.getException().getMessage());
    }
});

内容的提问来源于stack exchange,提问作者Jeevan Kumar A Das

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:15:07