如何在 Flutter 中暂停 bloc?

How to pause bloc in Flutter?

我想在一个块内打破一个 for 循环。我正在使用一个名为 _isRunning 的布尔值来控制我的 for 循环。但是当我的 for 循环是 运行 并导致 _isRunning bool 在 for 循环完成执行后更改其值时,其他事件没有执行。如何停止 bloc 内的 for 循环?

class myBloc extends Bloc<myEvent, myState> {
  myBloc() : super(Stopped());

  var _isRunning = false;

  @override
  Stream<myState> mapEventToState(myEvent event) async* {
    if (event is Start) {
      _isRunning = true;
      yield Running();
      for (var i = 0; index < 10; i++) {
        if (_isRunning) {
          print('$i');
          await Future.delayed(const Duration(seconds: 1), () => null);
        } else {
          break;
        }
      }
      yield Stopped();
    }
    if (event is Stop) {
      _isRunning = false;
      yield Stopped();
    }
  }
}

我相信您的问题应该通过将 for 循环移动到异步方法中然后在该方法中添加停止事件来解决

class myBloc extends Bloc<myEvent, myState> {
  myBloc() : super(Stopped());

  var _isRunning = false;

  @override
  Stream<myState> mapEventToState(myEvent event) async* {
    if (event is Start) {
      _isRunning = true;
      yield Running();
      _asyncMethod(); // no await here
    }
    if (event is Stop) {
      _isRunning = false;
      yield Stopped();
    }
  }
  Future<void> _asyncMethod() async {
    for (var i = 0; i < 10; i++) {
      if (_isRunning) {
        print('$i');
        await Future.delayed(const Duration(seconds: 1), () => null);
      } else {
        break;
      }
    }
    add(stop())
  }
}

Bloc将每一个事件都加入到一个队列中,并按顺序一个一个地处理,这意味着它会忽略停止事件,直到开始事件结束。然而,dart 永远不会等待异步方法完成,除非明确告知(使用等待),因此将所有代码移动到异步方法中可以让它 运行 按照自己的节奏进行。