首页 > 解决方案 > 未处理的异常:错误状态:流已被收听

问题描述

我有以下代码在成功验证后将用户导航到主屏幕

Future navigateToHomeScreen(
    StreamedResponse value,
    BuildContext context,
  ) async {
    print('Navigating to Home Screen');
    String userString = await value.stream.bytesToString();
    Map<String, dynamic> logInResponseData = jsonDecode(userString)['data'];
    UserManager.persistUser(logInResponseData);
    Navigator.of(context).pushReplacementNamed(HomeWidget.routePath);
  }

成功注册或登录后,调用上述函数,但我不断收到:

Unhandled Exception: Bad state: Stream has already been listened to.

我该如何解决?

标签: flutterdart

解决方案


您不能将多个侦听器添加到常规流中。在您的代码中,如果您的 navigateToHomeScreen 函数被多次调用,那么您基本上是在向流中添加了那么多侦听器。你有两种方法可以修复它。

  1. 检查流是否已经有任何监听器。如果有,请在添加新之前将其删除。

  2. 这有点容易,但不是最好的解决方案。您可以通过执行以下操作将流转换为广播流: value.stream.asBroadcastStream().bytesToString(); 这会将您的常规流转换为广播流。通过这样做,您可以将多个侦听器添加到您的流中,原因是这不是最佳选择,因为如果您以前的流侦听器没有被杀死,他们将不断收到通知并继续消耗您的阅读。如果您使用的服务是根据读写向您收费的(例如 cloud firestore),那么这可能不是一个好主意。

https://medium.com/flutter-community/flutter-stream-basics-for-beginners-eda23e44e32f这是一个链接,可以更好地了解 Dart 和 Flutter 中的 Streams


推荐阅读