在Flutter中捕获云Firestore文档快照错误

时间:2020-08-07 15:43:09

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

我正在尝试在侦听文档快照时捕获firstore插件引发的错误。该错误被引发在调试日志中,但是在catch错误或处理错误时我无法访问它。这是插件需要的增强功能还是有办法?

调试错误

I / System.out(16041):com.google.firebase.firestore.FirebaseFirestoreException:PERMISSION_DENIED:缺少权限或权限不足。

这是我的代码,我尝试了多种方法,但是没有用

export const MakeComponent = props => {
  const { path, value, info, update } = props;

  const [val, setVal] = useState();

  // get initial state after initial render
  useEffect(() => {
    setVal(value)
  }, [])
  console.log(value, val); // abc undefined then will log abc abc

 return (...)
}
_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());
    }

2 个答案:

答案 0 :(得分:2)

“缺少权限或权限不足”表示您的查询违反了您的安全规则之一。您将需要检查这些规则,并确保它们允许您打算执行的查询。

documentation for security rules众多,有必要了解它们的工作方式,以便从Web和移动客户端有效地使用Firestore。

您无法从Firestore查询中捕获错误并非正确。您不能使用try / catch-必须将错误处理程序传递给listen()

答案 1 :(得分:1)

我遇到了同样的问题。 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版本,您的代码将按预期开始工作。