【发布时间】:2020-04-25 07:58:30
【问题描述】:
我想收听一个显示在 TabBarView 中的 Widget 内的 websocket 流:
import 'package:flutter/material.dart';
import 'package:web_socket_channel/io.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
class RabitHouse extends StatefulWidget {
final channel = IOWebSocketChannel.connect('ws://echo.websocket.org');
@override
_RabitHouseState createState() => _RabitHouseState();
}
class _RabitHouseState extends State<RabitHouse> {
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: 2,
child: Scaffold(
appBar: AppBar(
bottom: TabBar(tabs: [
Tab(
icon: Icon(
Icons.adb,
),
),
Tab(
icon: Icon(
Icons.android,
)),
]),
),
body: TabBarView(children: [
Rabit(channel: widget.channel),
Rabit(channel: widget.channel),
]),
));
}
@override
void dispose() {
widget.channel.sink.close();
super.dispose();
}
}
class Rabit extends StatefulWidget {
final WebSocketChannel channel;
const Rabit({Key key, this.channel}) : super(key: key);
@override
_RabitState createState() => _RabitState();
}
class _RabitState extends State<Rabit> {
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: widget.channel.stream,
builder: (context, snapshot) => Text('pew pew'),
);
}
}
但是,当我更改选项卡时,我得到了一个例外:
════════ 小部件库捕获的异常════════════════════════════════ ═════════════════════ 在构建 Rabit(状态:_RabitState#cd14b)时引发了以下 StateError: 错误状态:Stream 已被收听。
我错过了什么?
【问题讨论】: