location onChange函数即使在静态位置(Flutter)时也会不断被调用

问题描述 投票:0回答:1

我正在使用Flutter中的Location 3.0.1软件包。我想听听位置的变化。我的代码(几乎完全从该包的github示例中获取)如下:

class _HomePageState extends State<HomePage> {
  StreamSubscription<LocationData> locationSubscription;
  final Location location = new Location();
  LocationData _locationData;
  String _error;
  var popupData;

  PermissionStatus _permissionGranted;

  _checkPermissions() async {
    PermissionStatus permissionGrantedResult = await location.hasPermission();
    setState(() {
      _permissionGranted = permissionGrantedResult;
    });
  }

  _requestPermission() async {
    if (_permissionGranted != PermissionStatus.GRANTED) {
      PermissionStatus permissionRequestedResult =
      await location.requestPermission();
      print(permissionRequestedResult);
      setState(() {
        _permissionGranted = permissionRequestedResult;
      });
      if (permissionRequestedResult != PermissionStatus.GRANTED) {
        return;
      } else{
        _loadLocation();
      }
    }
    else{
      _loadLocation();
    }
  }

  Future<void> _listenLocation() async {
    locationSubscription =
        location.onLocationChanged().handleError((dynamic err) {
          setState(() {
            _error = err.code;
          });
          locationSubscription.cancel();
        }).listen((LocationData currentLocation) {
          setState(() {
            _error = null;

            _locationData = currentLocation;
          });
        });
  }

  void _loadLocation() async {
    _locationData = await location.getLocation();
    _listenLocation();
  }

  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    if(_locationData == null){
      _checkPermissions();
      _requestPermission();
    }
.  .  .

但是,即使位置未更改(我正在运行),流订阅仍会被频繁触发(大约2-3秒一次)(这会导致调用setState,并重新构建整个屏幕)该代码在我的模拟器上,因此位置应为静态)。有谁知道为什么会这样以及如何解决?

扑动医生的输出:

[✓] Flutter (Channel stable, v1.12.13+hotfix.5, on Mac OS X 10.15.2 19C57, locale en-US)
    • Flutter version 1.12.13+hotfix.5 at /Users/foo/development/flutter
    • Framework revision 27321ebbad (4 months ago), 2019-12-10 18:15:01 -0800
    • Engine revision 2994f7e1e6
    • Dart version 2.7.0


[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
    • Android SDK at /Users/foo/Library/Android/sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-29, build-tools 28.0.3
    • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 11.3)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 11.3, Build version 11C29
    • CocoaPods version 1.8.4

[✓] Android Studio (version 3.5)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin version 39.0.3
    • Dart plugin version 191.8423
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)

[✓] IntelliJ IDEA Ultimate Edition (version 2019.1.4)
    • IntelliJ at /Applications/IntelliJ IDEA.app
    • Flutter plugin version 38.1.3
    • Dart plugin version 191.8593

[✓] Connected device (2 available)
    • Android SDK built for x86 • emulator-5554                        • android-x86 • Android 9 (API 28) (emulator)
    • iPhone 11 Pro Max         • B3536B50-C435-4442-9CF4-69D470B979CA • ios         •
      com.apple.CoreSimulator.SimRuntime.iOS-13-3 (simulator)

• No issues found!

[如果有人可以给我一小段显示如何正确侦听更新的代码,那也将有所帮助(即,我的代码没有完全像这样设置)。

flutter geolocation android-emulator location listener
1个回答
0
投票

由于您将代码放入Widget build中,因此会导致此问题您可以像这样将Permission Handler_listenLocation()_loadLocation()移至initState()

void initState() {
    if(_locationData == null){
          _checkPermissions();
          _requestPermission();
        }

    super.initState();      
}
© www.soinside.com 2019 - 2024. All rights reserved.