Почему my then () никогда не вызывается при добавлении потока в мой контроллер потока? - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть блок blo c, в котором есть контроллер потока, а в конструкторе блока blo c я добавляю поток в контроллер. Я жду, пока поток не будет добавлен, а затем добавляю слушателя к нему. Но функция then () никогда не вызывается. Я уверен, что код GeoLocator () работает, потому что раньше у меня он был в виджете с состоянием, и это работало как чудо, но я решил переместить бизнес-логи c в блок c.

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

Когда я избавляюсь от провайдера blo c при удалении виджета и вызываю dispose в blo c, он выдает следующую ошибку

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

1 Ответ

0 голосов
/ 24 апреля 2020

В итоге я использовал это

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

С виджетом построителя потока.

...