如何在 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 永远不会等待异步方法完成,除非明确告知(使用等待),因此将所有代码移动到异步方法中可以让它 运行 按照自己的节奏进行。
我想在一个块内打破一个 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 永远不会等待异步方法完成,除非明确告知(使用等待),因此将所有代码移动到异步方法中可以让它 运行 按照自己的节奏进行。