【问题标题】:Flutter: Location package Not working on First Time App InstallFlutter:位置包不适用于首次应用安装
【发布时间】:2018-10-04 09:33:23
【问题描述】:

我当前的应用程序使用 Location 包 (link) 来获取用户当前的经纬度,用于查找附近的设施。

这是我正在使用的代码(类似于文档中的示例)

  Map<String, double> _currentLocation;
  Map<String, double> _startLocation;

  StreamSubscription<Map<String, double>> _locationSubscription;
  String error;
  bool _permission = false;

  Location _location = new Location();

  // Platform messages are asynchronous, so we initialize in an async method.
  initPlatformState() async {
    Map<String, double> location;

    try {
      _permission = await _location.hasPermission();
      location = await _location.getLocation();

      error = null;
    } on PlatformException catch (e) {
      if (e.code == 'PERMISSION_DENIED') {
        error = 'Permission denied';
      } else if (e.code == 'PERMISSION_DENIED_NEVER_ASK') {
        error = 'Permission denied - please ask the user to enable it from the app settings';
      }

      location = null;
    }

    setState(() {
      _startLocation = location;
      print("Starting coordinates: ${_startLocation["latitude"]}, ${_startLocation["longitude"]}");
    });
  }

@override
  void initState() {
    super.initState();

      initPlatformState();

      _locationSubscription =
          _location.onLocationChanged().listen((Map<String,double> result) {
            setState(() {
              _currentLocation = result;
              print("Current coordinates: ${_currentLocation["latitude"]}, ${_currentLocation["longitude"]}");
            });
          });
  }

我面临的唯一问题是,每当全新安装应用程序的新 apk 时,在授予位置权限后应用程序找不到位置。

在授予位置后,我设置了一个打印语句来打印出用户的位置,但由于某种原因,它只在第一次时没有打印任何内容。重新启动应用程序后,它会很好地打印出位置。

安装后首次打开

重启应用后

有使用 Location 包的专家可以帮助我解决这个问题吗?

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    根据插件的源代码,当您调用getLocation 方法时,它会要求ActivityCompat.requestPermissions 获得所需的权限,然后进行处理。根据来自 Google 的docs

    此方法异步运行。立即返回,用户响应提示后,系统调用应用程序的回调方法并返回结果

    ,但颤振插件有一个关于 Android 6+ 位置回调的issue,作为一种解决方法,建议瞄准 SDK 21。

    所以这个插件的“原生”部分似乎在 Android 6+ 上不能很好地运行。有两种解决方法:

    1. 为您的 Android 项目将 SDK 设置为 21 版本,但我绝对不建议这样做。
    2. 创建某种“hello 屏幕”,用于介绍应用并在那里处理权限。

    同时,我对插件的问题很感兴趣,因为它的实现看起来不错,所以如果我找到解决方法,我会回到这里。

    【讨论】:

    • 感谢您的回复。我刚刚在回购中读到了一些人面临与我类似的问题的问题。希望我们能尽快解决这个问题。
    • 在没有重大源代码更改的情况下解决这个问题很复杂,所以修复似乎有点脏。您可以在此处关注有关此问题的新闻 - github.com/Lyokone/flutterlocation/pull/84 据我所知,该插件并未真正处于积极开发中,因此请随时 fork 固定版本并将其用于您的应用程序。
    • 当然是 Olexa。通过使用简单权限包在登录页面中请求权限并在登录后获取位置,我设法找到了解决我的问题的方法。到目前为止,它工作得很好。
    猜你喜欢
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    相关资源
    最近更新 更多