У меня есть блок 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(),
);
}