在 Flutter 中捕获云 Firestore 文档快照错误
Posted
技术标签:
【中文标题】在 Flutter 中捕获云 Firestore 文档快照错误【英文标题】:Capture cloud firestore document snapshot error in Flutter 【发布时间】:2020-11-27 23:38:41 【问题描述】:我试图在听文档快照时捕获 firstore 插件在颤振中抛出的错误。该错误在调试日志中引发,但我无法在捕获错误或处理错误时访问它。这是插件需要的增强功能还是有办法?
调试出错
I/System.out(16041): com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: 权限缺失或不足。
这是我的代码,我尝试了很多方法,但都没有成功
_getUserCollection.document(uid).snapshots();
_getUserCollection.document(uid).snapshots().handleError((onError)
print(onError.toString());
);
try
_getUserCollection.document(uid).snapshots();
catch (e)
print(e);
try
_getUserCollection.document(uid).snapshots();
on PlatformException catch (e)
print(e.toString());
_getUserCollection.document(uid).snapshots().listen((event)
print('here on listen');
, onError: (e)
print('on error $e');
);
【问题讨论】:
【参考方案1】:“缺少权限或权限不足”表示您的查询违反了您的一项安全规则。您将需要检查这些规则,并确保它们允许您打算执行的查询。
documentation for security rules 很多,有必要了解它们的工作原理,以便从 Web 和移动客户端有效地使用 Firestore。
您无法从 Firestore 查询中捕获错误是不正确的。您不能使用 try/catch - 您必须将错误处理程序传递给 listen()。
【讨论】:
您好道格,谢谢您的回答。我在安全规则中使用 idtoken 到期时间来不允许过期的 id 令牌查询数据库。我已经使用 onError 句柄来监听数字 4 代码。这是正确的方法吗? 您不必编写任何规则来检查过期。过期的令牌会被自动拒绝。您确定打印到日志的错误实际上不是您的错误处理程序输出吗? 嗨,Doug,是的,错误没有被捕捉到快照,但是当你使用 get 时它被捕捉到了。 如果您对规则有特定问题,请发布一个新问题,其中显示规则以及不符合您预期的查询。【参考方案2】:我遇到了同样的问题。 PERMISSION_DENIED 出现在日志中,但我想自己捕获错误,以便将其显示给用户。我在 GitHub 上发现了这个问题:
Firebase - native error messages not provided issue
它指出已经做了很多工作来改进 Firebase 中的错误处理。因此,我昨天将我的应用程序升级到了最新版本的 firebase_auth(撰写本文时为 0.18.0),现在我可以像这样捕获和处理 PERMISSION_DENIED 错误:
return StreamBuilder<List<DistanceDocSnapshot>>(
stream: _eventStream,
builder: (BuildContext context,
AsyncSnapshot<List<DistanceDocSnapshot>> snapshot)
if (snapshot.hasError)
return Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
'Error retrieving events: $snapshot.error.toString()',
style: TextStyle(fontSize: 20.0),
textAlign: TextAlign.center,
),
);
if (snapshot.hasData)
// Handle data as desired
);
这可以在以下屏幕截图Screenshot of error on my app 中看到(我必须提供屏幕截图的链接,因为我还没有足够的代表来嵌入图像)
我的代码布局与你的不同,但我认为如果你升级你的 firebase_auth 版本,你的代码就会开始工作。
【讨论】:
以上是关于在 Flutter 中捕获云 Firestore 文档快照错误的主要内容,如果未能解决你的问题,请参考以下文章
如何使用颤振在 Firebase 云 Firestore 中添加多个节点
Flutter:将firestore快照转换为streambuilder中的列表
将 Firebase 存储下载 URL 推送到 Firebase 云 Firestore