我有一个 StreamBuilder,它监听使用包 web_socket_channel 创建的流:^1.1.0创建的流。
\nStream getLocationsStream({LatLngBounds latLngBounds, LatLng location}) {\n if (branchMapChannel == null)\n branchMapChannel = IOWebSocketChannel.connect(wsEndpointURL("business/branch/maps"));\n return branchMapChannel.stream;\n}\nRun Code Online (Sandbox Code Playgroud)\nStreamBuilder 监听此流(getLocationsStream())。我在名为Maps() 的自定义小部件中使用此 Streambuilder 。当在主页中调用Maps()时,它工作正常。但是当Maps()时,它会显示以下错误。
\n\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
发生此问题是因为您尝试订阅Single Subscription Stream两次。
如果你查看IOWebSocketChannel的文档,你可以看到:
\n\n\n流 \xe2\x86\x92 流
\n
\n从另一个终结点发出值的单订阅流。
\n最终
而不是直接将套接字流分配给流构建器:
\n只需使用asBroadcastStream将您的流转换为广播流。
\nStream 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}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1041 次 |
| 最近记录: |