添加依赖
web_socket_channel: ^2.2.0 //注意缩进空格
代码
class WebSocketWidget extends StatefulWidget {
const WebSocketWidget({super.key});
@override
State<WebSocketWidget> createState() {
return WebSocketState();
}
}
class WebSocketState extends State<WebSocketWidget> {
final TextEditingController _controller = TextEditingController();
late IOWebSocketChannel channel;
String _text = "";
@override
void initState() {
super.initState();
//创建websocket连接
channel = IOWebSocketChannel.connect('ws://echo.websocket.org');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("WebSocket")),
body: Padding(
padding: const EdgeInsets.all(20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Form(
child: TextFormField(
controller: _controller,
decoration: const InputDecoration(labelText: "Send a message"),
),
),
StreamBuilder(
stream: channel.stream,
builder: ((context, snapshot) {
//如果网络不同
if (snapshot.hasError) {
String error= snapshot.error.toString();
_text = "网络有问题,请稍候重试... $error ";
} else if (snapshot.hasData) {
_text = "echo: $snapshot.data";
}
return Padding(
padding: const EdgeInsets.symmetric(vertical: 20),
child: Text(_text),
);
}),
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _sendMessage,
tooltip: "Send message",
child: const Icon(Icons.send),
),
);
}
void _sendMessage() {
if (_controller.text.isNotEmpty) {
channel.sink.add(_controller.text);
}
}
@override
void dispose() {
channel.sink.close();
super.dispose();
}
}