【问题标题】:Capture cloud firestore document snapshot error in Flutter在 Flutter 中捕获云 Firestore 文档快照错误
【发布时间】: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');
    });

【问题讨论】:

    标签: firebase flutter error-handling google-cloud-firestore firebase-security


    【解决方案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 版本,你的代码就会开始工作。

    【讨论】:

      猜你喜欢
      • 2022-01-25
      • 2018-03-19
      • 2019-03-22
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 2019-08-02
      • 2020-12-16
      相关资源
      最近更新 更多