该代码演示了如何在Flutter中使用 Stream 和 StreamController 来实现组件之间的通信。通过两个窗口的交互,用户可以看到消息传递和状态更新的实时效果。
import 'dart:async';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final StreamController<String> _streamControllerWindow1 =
StreamController<String>();
final StreamController<String> _streamControllerWindow2 =
StreamController<String>();
void dispose() {
_streamControllerWindow1.close();
_streamControllerWindow2.close();
super.dispose();
}
Widget build(BuildContext context) {
return Scaffold(
body: Row(
children: <Widget>[
Window1(
streamController: _streamControllerWindow1,
incomingStream: _streamControllerWindow2.stream),
Window2(
streamController: _streamControllerWindow2,
incomingStream: _streamControllerWindow1.stream),
],
),
);
}
}
class Window1 extends StatefulWidget {
final StreamController<String> streamController;
final Stream<String> incomingStream;
Window1({required this.streamController, required this.incomingStream});
_Window1State createState() => _Window1State();
}
class _Window1State extends State<Window1> {
int _counter = 0;
String _receivedText = '';
void initState() {
super.initState();
widget.incomingStream.listen((data) {
setState(() {
_receivedText = data;
});
});
}
Widget build(BuildContext context) {
String messageToSend = 'Counter: $_counter';
return Expanded(
child: Container(
decoration: BoxDecoration(
border: Border.all(color: Colors.blue, width: 2.0),
color: Colors.blue[100],
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Received from Window 2:',
style: TextStyle(fontSize: 18.0),
),
SizedBox(height: 10.0),
Text(
_receivedText,
style: TextStyle(fontSize: 24.0, fontWeight: FontWeight.bold),
),
SizedBox(height: 20.0),
Text(
'My Counter: $_counter', // 添加显示自身计数器的文本
style: TextStyle(fontSize: 18.0),
),
SizedBox(height: 10.0),
ElevatedButton(
onPressed: () {
widget.streamController.add(messageToSend);
},
child: Text('Send Message'),
),
SizedBox(height: 10.0),
ElevatedButton(
onPressed: () {
setState(() {
_counter++;
});
},
child: Text('Increase Counter'),
),
],
),
),
);
}
}
class Window2 extends StatefulWidget {
final StreamController<String> streamController;
final Stream<String> incomingStream;
Window2({required this.streamController, required this.incomingStream});
_Window2State createState() => _Window2State();
}
class _Window2State extends State<Window2> {
int _counter = 0;
String _receivedText = '';
void initState() {
super.initState();
widget.incomingStream.listen((data) {
setState(() {
_receivedText = data;
});
});
}
Widget build(BuildContext context) {
String messageToSend = 'Counter: $_counter';
return Expanded(
child: Container(
decoration: BoxDecoration(
border: Border.all(color: Colors.green, width: 2.0),
color: Colors.green[100],
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Received from Window 1:',
style: TextStyle(fontSize: 18.0),
),
SizedBox(height: 10.0),
Text(
_receivedText,
style: TextStyle(fontSize: 24.0, fontWeight: FontWeight.bold),
),
SizedBox(height: 20.0),
Text(
'My Counter: $_counter', // 添加显示自身计数器的文本
style: TextStyle(fontSize: 18.0),
),
SizedBox(height: 10.0),
ElevatedButton(
onPressed: () {
widget.streamController.add(messageToSend);
},
child: Text('Send Message'),
),
SizedBox(height: 10.0),
ElevatedButton(
onPressed: () {
setState(() {
_counter++;
});
},
child: Text('Increase Counter'),
),
],
),
),
);
}
}
以下是对这段代码的分析:
一、整体结构
这段代码是一个使用 Flutter 框架构建的应用程序,实现了两个窗口(Window1和Window2)之间的通信以及各自的计数器功能。
二、主要部分分析
main函数
void main() { runApp(MyApp()); }:应用程序的入口点,启动应用并传入MyApp实例。
MyApp类
继承自StatelessWidget,在build方法中返回一个MaterialApp,设置了应用的主页面为MyHomePage。
MyHomePage类
继承自StatefulWidget,在createState方法中返回_MyHomePageState。
_MyHomePageState类:
包含两个StreamController:_streamControllerWindow1和_streamControllerWindow2,用于管理两个窗口之间的数据流。
在dispose方法中关闭两个StreamController以释放资源。
build方法:
构建一个Scaffold,其主体是一个水平排列的Row,包含Window1和Window2两个小部件,分别传入对应的StreamController和流入的Stream。
Window1类和Window2类
都继承自StatefulWidget,分别包含一个StreamController和一个流入的Stream。
对应的状态类_Window1State和_Window2State:
维护一个计数器_counter和接收到的文本_receivedText。
在initState方法中,监听流入的Stream,当有新数据时更新_receivedText。
build方法:构建一个带有边框和背景颜色的容器,内部包含描述文本、接收到的文本、自身计数器文本以及两个按钮,一个用于发送消息(调用对应的StreamController.add方法),一个用于增加自身计数器(通过setState更新_counter)。
三、功能总结
这个应用程序创建了两个窗口,每个窗口都有自己的计数器和接收区域。通过StreamController和Stream实现了两个窗口之间的通信,当一个窗口发送消息时,另一个窗口可以接收到并显示。同时,每个窗口还可以独立地增加自己的计数器。这种设计展示了 Flutter 中状态管理和数据流的使用方法,以及如何构建具有交互性的多窗口应用。