我从一个方法中得到null返回值.颤振



我是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}}

我尝试了存储库方法的TFuture<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 fromGeolocatorAPI directly into aStream,并从block中侦听它。

现在,各州正像预期的那样流动,携带着新的位置价值。

剩下的唯一需要解决的问题(我实际上认为我没有(是MapScrenBlocBuilder无法获得来自新状态的值,并且当我像在_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(}}

相关内容

最新更新