在bloc模式中,可以使用StreamController和Stream来实现在不同屏幕之间传递状态。
首先,在要传递状态的屏幕中创建一个StreamController,该控制器将负责向订阅者广播状态更改。例如,假设要将用户输入的文本从屏幕1传递到屏幕2:
class Screen1 extends StatelessWidget {
final textController = TextEditingController();
final _textStreamController = StreamController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: TextField(
controller: textController,
onChanged: (String text) {
_textStreamController.sink.add(text);
},
),
),
);
}
//Don't forget to dispose StreamController
@override
dispose() {
_textStreamController.close();
}
}
在此示例中,StreamController _textStreamController在屏幕1中创建。每次用户更改文本字段中的文本时,都会通过_sink_方法向订阅的广播消息中添加新文本。以下是接收屏幕的代码:
class Screen2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: StreamBuilder(
stream: BlocProvider.of(context).textStream,
builder: (context, snapshot) {
return Text(snapshot.data ?? '');
},
),
),
);
}
}
在此示例中,将在_bloc_模式中使用一个StreamBuilder Widget将接收的文本显示在屏幕2中。可以在_bloc_类中创建一个新的StreamController或使用现有的StreamController。所以Screen1和Bloc类代码如下:
class Screen1 extends StatelessWidget {
final textController = TextEditingController();
final _textStreamController = StreamController();
@override
Widget