为什么每次将流添加到流控制器时,我的then()都不会被调用?

问题描述 投票:0回答:1

我有一个具有流控制器的块,并且在该块的构造函数中,将流添加到该控制器。我等到流被添加,然后向它添加一个侦听器。但是then()永远不会被调用。我确信GeoLocator()代码能正常工作,因为我以前在有状态的小部件中使用过它,并且它像一个魅力一样起作用,但是我决定将业务逻辑移到一个整体上。

import 'dart:async';

import 'package:geolocator/geolocator.dart';

class LocationBloc {
  final Geolocator _geolocator = Geolocator();
  final LocationOptions _locationOptions = LocationOptions(accuracy: LocationAccuracy.high, distanceFilter: 10);
  StreamController<Position> _positionStreamController = StreamController<Position>();
  double _speed = 0;

  double get speed => _speed;

  LocationBloc() {
    print('it gets here');
    final Stream<Position> positionStream = _geolocator.getPositionStream(_locationOptions);
    print('and here');
    _positionStreamController.addStream(positionStream).then((value) {
      print('it never gets here');
      print(value);
      _positionStreamController.stream.listen((Position position) {
        this._speed = position == null ? 0 : position.speed;
      });
    });
  }

  void dispose() {
    print('dispose location stream');
    _positionStreamController.close();
    _speed = 0;
  }
}

[当处置小部件时我处置他的bloc提供者并在bloc中调用处置时,它会引发以下错误

Bad state: Cannot add event while adding a stream

无状态小部件

class DigitalSpeedMeter extends StatelessWidget {

  static Widget create(BuildContext context) {
    return Provider(
      create: (_) => LocationBloc(),
      child: DigitalSpeedMeter(),
      dispose: (BuildContext context, LocationBloc bloc) => bloc.dispose(),
    );
  }
flutter dart stream
1个回答
0
投票

我最终使用了此

import 'dart:async';

import 'package:geolocator/geolocator.dart';

class LocationBloc {
  final Geolocator _geolocator = Geolocator();
  final LocationOptions _locationOptions = LocationOptions(accuracy: LocationAccuracy.high, distanceFilter: 10);
  StreamController<double> _streamController = StreamController<double>();
  Stream<double> get stream => _streamController.stream;

  LocationBloc() {
    _streamController.addStream(_geolocator.getPositionStream(_locationOptions).map((position) => position.speed ?? 0.0));
  }

  void dispose() {
    _streamController.close();
  }
}

带有流生成器小部件。

© www.soinside.com 2019 - 2024. All rights reserved.