错误状态:在执行 addStream

问题描述

我正在构建一个 Flutter 应用程序,它在说出单词的时间段内在屏幕上显示字幕,并在 Duration 过去后继续播放其他字幕(或不播放)。我希望能够在轮到他们播放时暂停此播放和/或返回或前进到其他字幕。

查看文档,似乎可以使用 Streams、StreamController 和 StreamBuilder 来构建它,但是使用这种范例进行异步状态管理有点棘手。

暂时我决定按整数循环遍历一个数组,其中包含要显示的字幕,以及字幕在屏幕上显示多长时间的延迟。如果我暂停,我想从我暂停的索引继续流,因此开始索引参数:

Stream<int> displaySubtitlesUntilEpisodeEnd(int startingIndex) async* {
    for (int i = startingIndex; i <= _allSubs.length; i++) {
      if (_playback == false) break;
      _currentSubtitleIndex = i;
      print("We're on subtitle $i");
      yield i;
      await Future.delayed(_allSubs[i].endTime - _allSubs[i].startTime);
    }
  }

如果我按下暂停 (_playback == false),我会中断流,显示临时字幕(由 _currentSubtitleIndex 全局维护),并等待新的输入:

StreamBuilder(
      stream: _subtitlePlaybackController.stream,builder: (context,snapshot) {
        // if we have data,we're streaming
        if (snapshot.hasData && _playback) {
          return createVisualSubtitle(snapshot.data as int);
        } else {
          //otherwise we retain a paused state without stream
          return createVisualSubtitle(_currentSubtitleIndex);
        }
      },);

开始和结束播放的函数如下:

void togglePlayback() async {
    setState(() {
      _playback = !_playback;
    });
    if (_playback) {
      await _subtitlePlaybackController
          .addStream(displaySubtitlesUntilEpisodeEnd(_currentSubtitleIndex));
    } else {
      await _subtitlePlaybackController.stream.drain();
    }
  }

在这里调用(playCommand() 是 togglePlayback()):

IconButton(
          icon: Icon(isPlaying ? Icons.pause : Icons.play_arrow),onpressed: () async => await playCommand(),),

我可以用这个启动流,暂停一次没有问题,但是当我再次点击播放时,我收到以下错误

[VERBOSE-2:ui_dart_state.cc(199)] Unhandled Exception: Bad state: Cannot add new events while doing an addStream
#0      _broadcastStreamController.addStream (dart:async/broadcast_stream_controller.dart:276:24)
#1      _InteractiveSubtitleScrollerState.togglePlayback (package:interactive_subtitle_poc/interactive_subtitle_scroller.dart:58:12)
#2      PlaybackControls.build.<anonymous closure> (package:interactive_subtitle_poc/widgets/playback_controls.dart:31:51)
#3      PlaybackControls.build.<anonymous closure> (package:interactive_subtitle_poc/widgets/playback_controls.dart:31:22)
#4      _InkResponseState._handleTap (package:Flutter/src/material/ink_well.dart:989:21)
#5      GestureRecognizer.invokeCallback (package:Flutter/src/gestures/recognizer.dart:182:24)
#6      TapGestureRecognizer.handleTapUp (package:Flutter/src/gestures/tap.dart:607:11)
#7      BaseTapGestureRecognizer._checkUp (package:Flutter/src/gestures/tap.dart:296:5)
#8      BaseTapGestureRecognizer.handlePrimaryPointer (package:fl<…>

据我所知,我需要排空并重新加载流,这样我就不会在流的顶部添加新的流。据说我可以暂停和/或恢复流,但我不确定如何使用此设计做到这一点。

有谁知道如何让它正确运行,或者我如何更好地构建这种功能

这里也是我的 StreamController 实例化,如果有帮助的话:

StreamController<int> _subtitlePlaybackController = StreamController<int>.broadcast();

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...