错误状态:使用 IOWebSocketChannel 时已监听 Stream

Abh*_*yil 1 dart flutter

我有一个 StreamBuilder,它监听使用包 web_socket_channel 创建的流:^1.1.0创建的流。

\n
Stream getLocationsStream({LatLngBounds latLngBounds, LatLng location}) {\n  if (branchMapChannel == null)\n    branchMapChannel = IOWebSocketChannel.connect(wsEndpointURL("business/branch/maps"));\n  return branchMapChannel.stream;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

StreamBuilder 监听此流(getLocationsStream())。我在名为Maps() 的自定义小部件中使用此 Streambuilder 。当在主页中调用Maps()时,它工作正常。但是当Maps()时,它会显示以下错误。

\n
\n

错误状态:流已被收听。

\n

抛出异常时,堆栈如下:\nI/flutter ( 2977): #3 _CompleterStream.listen\npackage:async/src/stream_completer.dart:135\nI/flutter ( 2977): #7 _StreamBuilderBaseState._subscribe\ npackage:flutter/\xe2\x80\xa6/widgets/async.dart:137\nI/flutter (2977): #8 _StreamBuilderBaseState.initState\npackage:flutter/\xe2\x80\xa6/widgets/async.dart:111 \nI/flutter (2977): #9 StatefulElement._firstBuild\npackage:flutter/\xe2\x80\xa6/widgets/framework.dart:4812\nI/flutter (2977): #10 ComponentElement.mount\npackage:flutter/ \xe2\x80\xa6/widgets/framework.dart:4649\nI/flutter ( 2977): #11 Element.inflateWidget\npackage:flutter/\xe2\x80\xa6/widgets/framework.dart:3615\nI/flutter (2977): #12 Element.updateChild\npackage:flutter/\xe2\x80\xa6/widgets/framework.dart:3377\nI/flutter (2977): #13 ComponentElement.performRebuild\npackage:flutter/\xe2\x80 \xa6/widgets/framework.dart:4700

\n
\n

Mid*_* MP 5

发生此问题是因为您尝试订阅Single Subscription Stream两次。

\n

如果你查看IOWebSocketChannel的文档,你可以看到:

\n
\n

流 \xe2\x86\x92 流
\n从另一个终结点发出值的单订阅流。
\n最终

\n
\n

建议#1:

\n

而不是直接将套接字流分配给流构建器:

\n
    \n
  • 创建一个 Socket Utility 类(单例或使用依赖注入来传递对象)
  • \n
  • 在 Socket Utility 类中监听套接字事件
  • \n
  • 在您的套接字实用程序中提供添加侦听器的选项
  • \n
  • 每当流发生变化时,通知所有监听者
  • \n
  • 在您的 Maps 类中使用 Socket Utility 对象并设置侦听器/回调
  • \n
\n

建议#2:

\n

只需使用asBroadcastStream将您的流转换为广播流。

\n
Stream getLocationsStream({LatLngBounds latLngBounds, LatLng location}) {\n  if (branchMapChannel == null) {\n    branchMapChannel = IOWebSocketChannel.connect(wsEndpointURL("business/branch/maps"));\n    broadCastStream = branchMapChannel.stream.asBroadcastStream();\n  }\n  return broadCastStream;\n}\n
Run Code Online (Sandbox Code Playgroud)\n