gpt4 book ai didi

flutter - TabBarView中具有WebSockets流的Streambuilder:错误状态:流已被监听

转载 作者:行者123 更新时间:2023-12-03 03:24:07 24 4
gpt4 key购买 nike

我想听一个在TabBarView中显示的小部件内的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'),
);
}
}

但是,当我更改选项卡时,出现异常:

════════ Exception caught by widgets library ═══════════════════════════════════════════════════════ The following StateError was thrown building Rabit(state: _RabitState#cd14b): Bad state: Stream has already been listened to.



我想念什么?

最佳答案

默认情况下,Dart中的流是单听器,这意味着如果您尝试多次收听它们,它们将引发错误。如果要在多个地方收听流,则需要将其转换为广播流:

class _RabitHouseState extends State<RabitHouse> {
Stream broadcastStream;

@override
void initState() {
broadcastStream = widget.channel.stream.asBroadcastStream();
super.initState();
}

@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(stream: broadcastStream),
Rabit(stream: broadcastStream),
]),
));
}

@override
void dispose() {
widget.channel.sink.close();
super.dispose();
}
}

class Rabit extends StatefulWidget {
final Stream stream;

const Rabit({Key key, this.stream}) : super(key: key);

@override
_RabitState createState() => _RabitState();
}

class _RabitState extends State<Rabit> {
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: widget.stream,
builder: (context, snapshot) => Text('pew pew'),
);
}
}

关于flutter - TabBarView中具有WebSockets流的Streambuilder:错误状态:流已被监听,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59634726/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com