未处理的异常:错误状态:流已经被监听

时间:2021-03-23 07:31:53

标签: flutter dart

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

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.

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

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

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

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