java - 在 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
解决方案
addSnapshotListener
是异步的,并在查询完成之前立即返回。您提供的回调会在一段时间后调用。同时,您的代码继续执行,并在查询仍在进行时返回 cWeek 的初始值。
如果您想从 ViewModel 提供 Firestore 查询(或任何异步函数)的结果,您应该返回一个 LiveData 来传递最终结果。调用者可以观察 ViewModel 的结果,只要它准备好就会被接收。
推荐阅读
- php - Android-PHP error undefined index Error raised
- wordpress - 如何在 wpbakery(visual composer) 中创建一个类似于 bootstrap 3 容器类的容器?
- java - 在设置值之前检查数组的长度
- php - 更改 php.ini 文件被忽略
- azure-active-directory - azure AD 和 Keycloak 同步
- python - 如何使用动态生成的内容作为输入在 Plotly Dash 中显示绘图?
- react-router - 如果未传递所有参数,则 React Router 修改 URL
- javascript - jQuery:$.post 没有从外部 php 文件加载数据
- visual-studio-code - Windows 10 上带有 Git Bash 的 VS Code 集成终端中的错误引号
- javascript - 如何影响烛台上色/下色类