Flutter:定位软件包在首次安装应用程序时不起作用

时间:2018-10-04 09:33:24

标签: dart flutter

我当前的应用使用“位置”软件包(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时,在授予位置权限后,该应用程序都找不到位置。

Permission Request

在授予位置信息后,我设置了一条打印语句以打印出用户的位置,但是由于某种原因,它并不是第一次打印任何内容。重新启动应用程序后,它会正确打印出位置。

安装后首次打开

First Terminal

重新启动应用程序后

Second Terminal

使用Location软件包的任何专家都可以帮助我解决此问题吗?

1 个答案:

答案 0 :(得分:2)

根据插件的源代码,当您调用componentWillMount() { const { navigation } = this.props; const myproperty = navigation.getParam('myproperty', '0'); this.setState({ property: myproperty}); } 方法时,它会要求getLocation获得所需的权限,然后进行处理。根据Google的docs

  

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

,但是flutter插件有一个issue关于Android 6+的位置回调的信息,作为一种解决方法,建议使用SDK 21。

因此,该插件的“本机”部分似乎不适用于Android 6+。有两种解决方法:

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

同时,我对插件的问题很感兴趣,因为它的实现似乎不错,因此,如果我找到解决方法,请回到这里。