我正在使用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!
[如果有人可以给我一小段显示如何正确侦听更新的代码,那也将有所帮助(即,我的代码没有完全像这样设置)。
由于您将代码放入Widget build
中,因此会导致此问题您可以像这样将Permission Handler
和_listenLocation()
,_loadLocation()
移至initState()
void initState() {
if(_locationData == null){
_checkPermissions();
_requestPermission();
}
super.initState();
}