我是Flutter/Dat的新手,我使用的是Flutter_bloc block/repository模式。
我很难从存储库方法中获得值,而在bloc方法中我得到了null。
block部分工作正常,但我从存储库方法获得的预期LatLng值为null。
集团价值和事件到状态方法:
LatLng locationStream;
Stream<MapState> _mapGetLocationStreamToState(
GetLocationStream event) async* {
print('_mapGetLocationStreamToState event received : $event');
locationStream = await _mapRepository.getLocationStream();
print('_mapGetLocationStreamToState() locationStream is: $locationStream ');
yield LocationStream(locationStream);
}
打印:
flutter:_mapGetLocationStreamToState((locationStream为:null
flutter:事务正在转换{currentState:LocationStream{location:null},事件:"GetLocationStream"的实例,nextState:LocationStream{location:null}}
我尝试了存储库方法的T
和Future<T>
返回类型,从不同的范围返回值(请参阅注释掉的返回(,但无论从哪里返回值,我都会得到null。你能发现问题出在哪里吗?应该是getLocation()
方法,对吧?
非常感谢您的时间和帮助。
T:
LatLng getLocationStream() {
print('getLocationStream() called');
LatLng location;
LocationOptions locationOptions = LocationOptions(
accuracy: LocationAccuracy.bestForNavigation, distanceFilter: 0);
try {
if (isTracking == true) {
_positionStreamSubsciption.cancel();
isTracking = !isTracking;
} else {
_positionStreamSubsciption = locationManager
.getPositionStream(locationOptions)
.listen((Position position) {
if (position != null) {
location = LatLng(position.latitude, position.longitude);
// return location; // stops the stream
}
isTracking = !isTracking;
print('getLocationStream() location is : $location');
// return location; // returns null
});
// return location; // returns null
}
// return location; // returns null
} catch (error) {
print('startTracking error: $error');
}
return location; // returns null
}
打印:
flutter:getLocationStream((位置为:LatLng(纬度:37.33022,经度:-122.023788(flutter:getLocationStream((位置为:LatLng(纬度:37.330219,经度:-122.023748(颤振:getLocationStream((位置为:LatLng(纬度:37.330219,经度:-122.023708(flutter:getLocationStream((位置为:LatLng(纬度:37.330221,经度:-122.023668(
未来:
Future<LatLng> getLocationStream() {
print('getLocationStream() called');
print('isTracking was : $isTracking');
Future<LatLng> location;
LocationOptions locationOptions = LocationOptions(
accuracy: LocationAccuracy.bestForNavigation, distanceFilter: 0);
try {
if (isTracking == true) {
_positionStreamSubsciption.cancel();
// isTracking = !isTracking;
// print('isTracking was ${!isTracking} and now is : $isTracking');
} else {
_positionStreamSubsciption = locationManager
.getPositionStream(locationOptions)
.listen((Position position) {
if (position != null) {
location =
LatLng(position.latitude, position.longitude) as Future<LatLng>;
// return location;
}
print('getLocationStream() location is : $location');
// return location;
});
// return location;
}
isTracking = !isTracking;
print('isTracking is : $isTracking');
// return location;
} catch (error) {
print('startTracking error: $error');
}
}
打印:
flutter:getLocationStream((位置为:LatLng(纬度:37.324746,经度:-122.021542(flutter:getLocationStream((位置为:LatLng(纬度:37.324746,经度:-122.021573(颤振:getLocationStream((位置为:LatLng(纬度:37.324746,经度:-122.021605(
在对代码进行了一些修改后,我决定改变方法,而且似乎以前选择了错误的方法。我没有从存储库方法返回LatLng,而是决定转换Stream<Position> coming from
GeolocatorAPI directly into a
Stream,并从block中侦听它。
现在,各州正像预期的那样流动,携带着新的位置价值。
剩下的唯一需要解决的问题(我实际上认为我没有(是MapScren
BlocBuilder
无法获得来自新状态的值,并且当我像在_mapController.move(userLocation, 16);
中那样使用它时,会得到null。
LatLng userLocation = (state as LocationStream).location;
不是获取它的正确方法吗?
更新代码为:
BlocBuilder:
bloc: MapBloc(mapRepository: _mapRepository),
builder: (BuildContext context, MapState state) {
LatLng userLocation = (state as LocationStream).location;
return Scaffold(
..
存储库:
Stream<LatLng> getLocationStream() {
print('getLocationStream() called');
print('isTracking was : $isTracking');
Stream<LatLng> locationStream;
Stream<Position> _positionStream;
LocationOptions locationOptions = LocationOptions(
accuracy: LocationAccuracy.bestForNavigation, distanceFilter: 0);
try {
if (isTracking == true) {
_positionStreamSubsciption.cancel();
} else {
_positionStream = locationManager.getPositionStream(locationOptions);
handleData(Position position, EventSink<LatLng> sink) =>
sink.add(LatLng(position.latitude, position.longitude));
final transformer = StreamTransformer<Position, LatLng>.fromHandlers(
handleData: handleData);
locationStream = _positionStream.transform(transformer);
return locationStream;
}
isTracking = !isTracking;
print('isTracking is : $isTracking');
} catch (error) {
print('startTracking error: $error');
}
}
集团:
MapState get initialState => LocationStream(locationStream);
@override
Stream<MapState> mapEventToState(MapEvent event) async* {
// user location
if (event is GetLocationStream) {
print('MapBloc event received : $event');
yield* _mapGetLocationStreamToState(event);
}
if (event is LocationUpdated) {
yield* _mapLocationUpdatedToState(event);
}
}
Stream<MapState> _mapGetLocationStreamToState(
GetLocationStream event) async* {
print('_mapGetLocationStreamToState event received : $event');
_locationStreamSubscription =
_mapRepository.getLocationStream().listen((LatLng location) {
locationStream = location;
add(LocationUpdated(locationStream));
print(
'_mapGetLocationStreamToState() locationStream is: $locationStream ');
});
// yield LocationStream(locationStream);
}
控制台打印:
flutter:事件为LocationUpdated{更新位置:LatLng(纬度:37.3246,经度:-122.02457(}颤振:_mapGetLocationStreamToState((locationStream为:LatLng(纬度:37.3246,经度:-122.02457(flutter:事务为转换{currentState:LocationStream{location:LatLng(纬度:37.324603,经度:-122.024523(},事件:LocationUpdated{upstaded location:LatLng(纬度:37.3246,经度:-122.02457(},nextState:LocationStream{location:LatLng(纬度:37.3246,经度:-122.02457(}}