取消Flutter中的PositionStream



我想通过按下按钮来取消应用程序中的PositionStream。因此,我的当前位置不再更新(_C(。

我已经尝试过使用StreamSubscription(你可以在下面的代码中看到它(,但我只收到了这个错误:

dependentOnInheritedWidgetOfExactType((或dependentInheritedElement((在dispose((之后调用:ToiletMap(脏,依赖项:[MediaQuery],状态:_TiletMapState#4ccfe(生命周期状态:失效((

这是我的代码:

StreamSubscription _getPositionSubscription;
Future _getCurrentPositionStream() async {
bool locationService = await Geolocator.isLocationServiceEnabled();
if(locationService == true) {
LocationPermission permission = await Geolocator.checkPermission();
print(permission);
if(permission == LocationPermission.whileInUse || permission == LocationPermission.always) {
_getPositionSubscription = Geolocator.getPositionStream(desiredAccuracy: LocationAccuracy.high).listen((Position position) {
setState(() {
_currentPosition = position;
_controller.animateCamera(
CameraUpdate.newCameraPosition(
CameraPosition(
target: LatLng(position.latitude, position.longitude), zoom: 18
),
),
);
locDistance = getDistance().toString().substring(0,4);
});
});
} else {
LocationPermission permission = await Geolocator.requestPermission();
if (permission == LocationPermission.deniedForever) {
print('please go to settings and change location Permission from denied forever');
} else {
_getCurrentPositionStream();
}
}
} else {
print('locationService is unabled');
}
}
@override
void dispose() {
_getPositionSubscription?.cancel();
super.dispose();
}

我用这个按钮调用dispose函数。

GestureDetector(
onTap: () {
dispose();
},
child: Container(
margin: EdgeInsets.fromLTRB(5, 0, 0, 0),
child: Icon(Icons.clear, color: darkRed, size: 35),
),
)

有人知道我做错了什么吗?

您不应该调用dispose()。只需在GestureDetectoronTap方法中调用_getPositionSubscription?.cancel();。在dispose()方法中也保留_getPositionSubscription?.cancel();。这将确保在处置小部件时取消订阅,即使没有按下按钮也是如此。

相关内容

  • 没有找到相关文章

最新更新