.once() 从未使用实时数据库在 flutter 中触发 whenComplete()
.once() never fires whenComplete() in flutter using realtimedatabase
在 flutter web 中,
永远不会调用“In then”。我已经通过向 kDatabase 调用添加 async 和 await 并在没有异步的情况下调用它来尝试此操作。 whenComplete
块也从未被调用。
可能发生了什么?没有错误被捕获。任何帮助或观点将不胜感激。
void getpostDetail(String? postID) {
print("Before try");
try {
print("In try 1");
assert(postID != null);
print("In try 2");
kDatabase
.child('post')
.child(postID!)
.once()
.then((DatabaseEvent event) {
print("In then");
}).catchError((e, stackTrace) {
print("in catchError");
}).whenComplete(() => print("In whenComplete"));
}
} catch (error) {
print("In error");
} finally {
print("In finally");
}
}
更新:
我通过以下方式启用了日志:
FirebaseDatabase fd = FirebaseDatabase.instance;
fd.setLoggingEnabled(true);
DatabaseReference dr = fd.ref();
dr.child('post').child
.child(postID!)
.once()
.then
我明白了
03:36:33.833Z","description":"lets
repl","lanCode":"auto","parentkey":"-MxvCNmiJ9lRNX8XkwL4","retweetCount":0,"user":{"displayName":"Hunte
r","isVerified":false,"profilePic":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRzDG366qY7vXN
2yng09wb517WTWqp-oua-mMsAoCadtncPybfQ&s","userId":"va9C2IQ4ITf1zzfhKQvd7cZdncl2","userName":"@Hunterva9
c"},"userId":"va9C2IQ4ITf1zzfhKQvd7cZdncl2"}
并且 "In finally"
被调用。但是 "In then"
、"in catchError"
、"In whenComplete"
从未被调用过,而且我没有在需要的地方使用我的数据。
我尝试在 Chrome 上重现该问题,但无法重现。我的代码:
print("Before try");
try {
print("In try 1");
print("In try 2");
database.ref('71163140/chats')
.child('oF1b6J4Hz3NGzRb9RmSVFGJdcYi1')
.once()
.then((DatabaseEvent event) {
print("In then");
}).catchError((e, stackTrace) {
print("in catchError");
}).whenComplete(() => print("In whenComplete"));
} catch (error) {
print("In catch");
} finally {
print("In finally");
}
输出:
Before try
In try 1
In try 2
In finally
In then
In whenComplete
即使我尝试读取作为流的 non-existing 节点,这也是有意义的,因为读取 non-existing 节点不是错误。
我让它失败的唯一方法是在代码前添加 FirebaseDatabase.instance.goOffline()
,在这种情况下,输出变为:
Error: [firebase_database/unknown] Error: Client is offline.
所以我不确定你的情况是怎么回事。您可能想看看更改库版本是否有任何不同,但我认为最近这方面没有任何变化。
在 flutter web 中,
永远不会调用“In then”。我已经通过向 kDatabase 调用添加 async 和 await 并在没有异步的情况下调用它来尝试此操作。 whenComplete
块也从未被调用。
可能发生了什么?没有错误被捕获。任何帮助或观点将不胜感激。
void getpostDetail(String? postID) {
print("Before try");
try {
print("In try 1");
assert(postID != null);
print("In try 2");
kDatabase
.child('post')
.child(postID!)
.once()
.then((DatabaseEvent event) {
print("In then");
}).catchError((e, stackTrace) {
print("in catchError");
}).whenComplete(() => print("In whenComplete"));
}
} catch (error) {
print("In error");
} finally {
print("In finally");
}
}
更新: 我通过以下方式启用了日志:
FirebaseDatabase fd = FirebaseDatabase.instance;
fd.setLoggingEnabled(true);
DatabaseReference dr = fd.ref();
dr.child('post').child
.child(postID!)
.once()
.then
我明白了
03:36:33.833Z","description":"lets
repl","lanCode":"auto","parentkey":"-MxvCNmiJ9lRNX8XkwL4","retweetCount":0,"user":{"displayName":"Hunte
r","isVerified":false,"profilePic":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRzDG366qY7vXN
2yng09wb517WTWqp-oua-mMsAoCadtncPybfQ&s","userId":"va9C2IQ4ITf1zzfhKQvd7cZdncl2","userName":"@Hunterva9
c"},"userId":"va9C2IQ4ITf1zzfhKQvd7cZdncl2"}
并且 "In finally"
被调用。但是 "In then"
、"in catchError"
、"In whenComplete"
从未被调用过,而且我没有在需要的地方使用我的数据。
我尝试在 Chrome 上重现该问题,但无法重现。我的代码:
print("Before try");
try {
print("In try 1");
print("In try 2");
database.ref('71163140/chats')
.child('oF1b6J4Hz3NGzRb9RmSVFGJdcYi1')
.once()
.then((DatabaseEvent event) {
print("In then");
}).catchError((e, stackTrace) {
print("in catchError");
}).whenComplete(() => print("In whenComplete"));
} catch (error) {
print("In catch");
} finally {
print("In finally");
}
输出:
Before try
In try 1
In try 2
In finally
In then
In whenComplete
即使我尝试读取作为流的 non-existing 节点,这也是有意义的,因为读取 non-existing 节点不是错误。
我让它失败的唯一方法是在代码前添加 FirebaseDatabase.instance.goOffline()
,在这种情况下,输出变为:
Error: [firebase_database/unknown] Error: Client is offline.
所以我不确定你的情况是怎么回事。您可能想看看更改库版本是否有任何不同,但我认为最近这方面没有任何变化。