Reactjs 在异步函数中捕获错误时,在react中使用Effect不重新呈现

Reactjs 在异步函数中捕获错误时,在react中使用Effect不重新呈现,reactjs,react-native,asynchronous,expo,use-effect,Reactjs,React Native,Asynchronous,Expo,Use Effect,我试图在react native中获取用户在expo中的位置。enableNetworkproviderAsync()会提示弹出窗口以启用位置。我想在用户拒绝共享其位置时重新打开弹出窗口。当前,当我导航到我的地图屏幕时,弹出窗口仅打开一次,当我单击“不共享我的位置”时,它将不会重新打开 const [locationReady, setLocationReady] = useState(false); useEffect(() => { (async () => {

我试图在react native中获取用户在expo中的位置。
enableNetworkproviderAsync()
会提示弹出窗口以启用位置。我想在用户拒绝共享其位置时重新打开弹出窗口。当前,当我导航到我的地图屏幕时,弹出窗口仅打开一次,当我单击“不共享我的位置”时,它将不会重新打开

const [locationReady, setLocationReady] = useState(false);

  useEffect(() => {
    (async () => {
        if (!locationReady) {
        try {
          const enableLocation = await Location.enableNetworkProviderAsync();
          setLocationReady(true);
        } catch (e) {
          setLocationReady(false);
          console.log("locationReady erorr");
        }
      }
      })();
  }, [locationReady]);

您需要检查enableLocation的响应。这是你的电话号码

如果用户拒绝响应,则会有一个
范围告诉您他选择了什么

但是,对于每个响应,您都将其设置为true,并且永远不会出现错误。试试这个:

 if (!locationReady) {
        try {
          const enableLocation = await Location.enableNetworkProviderAsync();
          setLocationReady(enableLocation.scope !== "none");
        } catch (e) {
          setLocationReady(false);
          console.log("locationReady erorr");
        }

一旦用户拒绝了权限请求,您就不会再请求它了。您必须请求用户转到设置并允许所需的权限。 有两种方法可以做到这一点

  • 从“react native”导入{Linking}; 然后使用Linking.openSettings()打开组件内部的设置
  • 或者你可以使用图书馆

  • 我试过了,拒绝后仍然不会重新打开。我记录了错误。上面写着
    [错误:由于设备设置不满意,位置请求失败。]
    你的模拟器上安装了google play服务吗?我正在通过USB和expo应用程序在我的android手机上测试它。如果你还向android清单添加了权限,这应该可以工作。你能在沙箱里复制给我们吗?我可以试试。我查看了我的app.json文件,在android下没有权限。我需要包括这个吗?但是如果那不存在,我是如何获得该位置的许可的?因为如果我打开地图屏幕,第一次弹出窗口显示时,在允许位置后,它会工作。谢谢,我会尝试这个。如果位置已启用,并且用户在一段时间后禁用了位置共享,我如何提示警报以重新启用位置?一旦用户拒绝,您将无法提示警报以重新启用位置。iOS simple不允许这样做。在android上,当用户在请求权限时检查“永不再次请求”时也会发生同样的情况。因此,一旦用户拒绝了请求或通过设备设置禁用了请求,您必须要求用户从设置中启用它,而不是从初始警报中启用位置(这不会显示)。但是如果我从设置中重新启用位置,则不会发生任何事。如何检查它是否已启用?我在docs:hassServiceEnabledAsync()中找到了这个方法(当位置被启用时返回true)。这是一个粘贴箱:。我在pastebin中描述了这个问题。