首页 > 解决方案 > 在 Firestore 中读取时出现 Android 封装错误

问题描述

我已经在我的中设置了一个 getter 方法ViewModel来获取一个名为的 Long-type 字段cWeek。当我使用value.getLong内部时addSnapshotListener,它可以工作并从数据库返回值,但是当我尝试返回它时,变量为空。我真的不知道要寻找什么来解决这个问题。

吸气剂

// this var is initialized in global scope
Long cWeek = getCWeek();

public Long getCWeek() {
        new References()
                .getUserRefDoc()
                .addSnapshotListener(new EventListener<DocumentSnapshot>() {
                    @Override
                    public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException e) {
                        if (e != null) {
                            Log.d(TAG, "Could not get cWeek data " + e);
                        }
                        Long var = (Long) value.get("cWeek");

                        cWeek = var;
                        Log.d(TAG, "cWeek: " + cWeek);
                    }
                });
        Log.d(TAG, "cWeek AFTER: " + cWeek);
        return cWeek;
    }

日志猫:

D/DashboardViewModel: cWeek AFTER: null
D/DashboardViewModel: cWeek: 1

标签: javaandroidfirebasegoogle-cloud-firestoreandroid-viewmodel

解决方案


addSnapshotListener异步的,并在查询完成之前立即返回。您提供的回调会在一段时间后调用。同时,您的代码继续执行,并在查询仍在进行时返回 cWeek 的初始值。

如果您想从 ViewModel 提供 Firestore 查询(或任何异步函数)的结果,您应该返回一个 LiveData 来传递最终结果。调用者可以观察 ViewModel 的结果,只要它准备好就会被接收。


推荐阅读