在BLOC中,emit函数只能在EventHandler内部使用。这是因为BLOC的核心是通过Stream Controller来派发事件。下面是一个示例:
import 'dart:async';
import 'package:bloc/bloc.dart';
class CounterBloc extends Bloc {
CounterBloc() : super(0);
void increment() {
add(CounterEvent.increment);
}
void decrement() {
add(CounterEvent.decrement);
}
@override
Stream mapEventToState(
CounterEvent event,
) async* {
switch (event) {
case CounterEvent.increment:
yield state + 1;
break;
case CounterEvent.decrement:
yield state - 1;
break;
}
}
}
enum CounterEvent { increment, decrement }
在这个例子中,increment()和decrement()函数都用add()函数调用了CounterEvent.increment和CounterEvent.decrement事件。然后,这些事件被映射到mapEventToState()函数里,这个函数返回一个流对象Stream,其中包含当事件被派发时产生的新状态。通过使用yield关键字生成状态,我们可以通过BlocBuilder或者BlocListener获取这些状态并更新UI。由于emit函数只能在EventHandler内部使用,因此在BLOC之外,不能直接使用emit函数更新状态。