【问题标题】:useEffect in react not re-rendering when catching error in async function在异步函数中捕获错误时,useEffect in react 不重新渲染
【发布时间】:2021-06-25 07:29:15
【问题描述】:

我正在尝试在本机反应中获取用户在 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]);

【问题讨论】:

    标签: reactjs react-native asynchronous expo use-effect


    【解决方案1】:

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

    1. 从'react-native'导入{Linking}; 然后使用 Linking.openSettings() 打开组件内部的设置。
    2. 或者你可以使用库https://www.npmjs.com/package/react-native-permissions

    【讨论】:

    • 谢谢,我试试这个。如果位置已启用,但一段时间后用户禁用位置共享,我如何提示警报以重新启用位置?
    • 一旦用户拒绝,您将无法提示重新启用位置信息。 iOS简单不允许它。在 android 上,当用户在请求权限时选中“不再询问”时也会发生同样的情况。因此,一旦用户拒绝了请求或通过设备设置禁用了它,您必须要求用户从设置中启用它,而不是初始警报以启用位置(这不会显示)。
    • 但如果我从设置中重新启用该位置,则什么也不会发生。如何检查它是否已启用?我在文档中找到了这个方法: hasServicesEnabledAsync() (启用位置时返回 true)。这是一个粘贴箱:pastebin.com/G3Ta1KrK。我在 pastebin 中描述了问题。
    【解决方案2】:

    您需要检查 enableLocation 的响应。这是docs

    如果用户拒绝回复有一个scope 告诉你,他选择了什么。

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

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

    【讨论】:

    • 我试过了,拒绝后仍然无法重新打开。我记录了错误。它说[Error: Location request failed due to unsatisfied device settings.]
    • 你的模拟器上安装了google play服务吗?
    • 我正在通过 USB 和 expo 应用在我的 android 手机上对其进行测试。
    • 如果您还向 android manifest 添加了权限,这应该可以工作。你能在沙盒中为我们重现吗?
    • 我可以试试。我查看了我的 app.json 文件,在 android 下没有权限。我需要包括那个吗?但如果那不存在,我如何获得该位置的许可?因为如果我打开地图屏幕并且第一次显示弹出窗口,在允许位置后,它就可以工作。
    猜你喜欢
    • 1970-01-01
    • 2020-07-06
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 2020-01-06
    • 2022-06-18
    • 1970-01-01
    相关资源
    最近更新 更多