可使用 StreamController
作为 BLoC 的输出,并在每次状态变化时将新的状态添加到流中。以下是一个简单的示例:
import 'dart:async';
enum CounterEvent { increment }
class CounterBloc {
int _counter = 0;
final _counterController = StreamController();
Stream get counterStream => _counterController.stream;
void mapEventToState(CounterEvent event) {
if (event == CounterEvent.increment) {
_counter++;
_counterController.add(_counter);
}
}
void dispose() {
_counterController.close();
}
}
在此示例中,当事件 CounterEvent.increment
发生时,将更新 _counter
的值,并将新的计数器值添加到 _counterController
流中。获取 BLoC 值时,使用 counterStream
接收新值。
然后,您可以在 UI 中使用 StreamBuilder
将 counterStream
与视图结合起来:
class CounterWidget extends StatelessWidget {
final CounterBloc _counterBloc;
const CounterWidget({Key key, CounterBloc counterBloc})
: _counterBloc = counterBloc,
super(key: key);
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: _counterBloc.counterStream,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text('Counter: ${snapshot.data}');
} else {
return Text('Counter: 0');
}
},
);
}
}
通过上述方式解决后,每当一个新的 'CounterEvent.increment” 事件被触发时,该 BLoC 将向输出流发送新的值,使视图随之变化。