【问题标题】:I get null returned value from a method. Flutter我从方法中得到 null 返回值。扑
【发布时间】:2020-06-14 23:31:14
【问题描述】:

我是 Flutter/Dart 的新手,我正在使用 flutter_bloc bloc/repository 模式。

我正在努力从存储库方法中获取值,但我在 bloc 方法中得到了 null。

bloc 部分工作正常,但我从存储库方法中获得的预期 LatLng 值为 null。

bloc 的值和 Event to State 方法:

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);
      } 

打印:

颤振:_mapGetLocationStreamToState() locationStream 为:null

flutter: 事务是转换 { currentState: LocationStream {location: null},事件:“GetLocationStream”实例,nextState: LocationStream {location: null} }

我尝试了 TFuture&lt;T&gt; 存储库方法的返回类型,从不同的范围返回值(请参阅注释掉的返回),但无论我从哪里返回值,我总是得到 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(latitude:37.33022, 经度:-122.023788)颤振:getLocationStream()位置是: LatLng(纬度:37.330219,经度:-122.023748)颤动: getLocationStream() 位置是:LatLng(latitude:37.330219, 经度:-122.023708)颤振: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');
    }
  }

打印:

颤振:getLocationStream() 位置是:LatLng(latitude:37.324746, 经度:-122.021542)颤振:getLocationStream()位置是: LatLng(纬度:37.324746,经度:-122.021573)颤动: getLocationStream() 位置是:LatLng(latitude:37.324746, 经度:-122.021605)

【问题讨论】:

    标签: flutter return return-value


    【解决方案1】:

    在修改了一下代码后,我决定改变方法,似乎我之前选择了错误的方法。 我决定转换Stream&lt;Position&gt; coming fromGeolocatorAPI directly into aStream,而不是从存储库方法返回 LatLng,并从 bloc 收听它。

    现在状态正在按预期流动,并带有新的位置值。

    剩下要解决的唯一问题(我实际上认为我没有)是 MapScren BlocBuilder 没有获取来自新状态的值,并且在使用它时我得到 null _mapController.move(userLocation, 16);.

    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(latitude:37.3246, longitude:-122.02457)} 颤动: _mapGetLocationStreamToState() locationStream is: LatLng(latitude:37.3246, longitude:-122.02457) flutter: Transaction is 过渡{ currentState:LocationStream {location: LatLng(纬度:37.324603,经度:-122.024523)},事件: LocationUpdated { 更新位置:LatLng(latitude:37.3246, 经度:-122.02457)},下一个状态:LocationStream {位置: LatLng(纬度:37.3246,经度:-122.02457)} }

    【讨论】:

      猜你喜欢
      • 2020-10-31
      • 1970-01-01
      • 2014-10-30
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 2017-02-23
      • 1970-01-01
      相关资源
      最近更新 更多