在 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 中添加多个节点

如何使用云函数将数据写入云 Firestore

Flutter:将firestore快照转换为streambuilder中的列表

将 Firebase 存储下载 URL 推送到 Firebase 云 Firestore

云功能失败并出现异常:内部,Flutter 应用程序中没有代码

在颤动的异步函数中捕获 PlatformException