我有以下代码可以在身份验证成功后将用户导航到主屏幕
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.
我该如何解决这个问题?
答案 0 :(得分:0)
您不能向常规流添加多个侦听器。在您的代码中,如果您的 navigateToHomeScreen 函数被多次调用,则您基本上是在向流中添加那么多侦听器。您有两种方法可以修复它。
检查流是否已经有任何监听器。如果有,请在添加新的之前将其删除。
这有点容易,但不是最好的解决方案。您可以通过执行以下操作将流转换为 BroadcastStream:value.stream.asBroadcastStream().bytesToString();这会将您的常规流转换为广播流。通过这样做,您可以将多个侦听器添加到您的流中,因为这不是最佳选择,因为如果您以前的流侦听器没有被杀死,它们将不断收到通知并继续消耗您的读取。如果您使用的是根据读写次数收费的服务(例如 Cloud Firestore),那么这可能不是一个好主意。
https://medium.com/flutter-community/flutter-stream-basics-for-beginners-eda23e44e32f 这是一个链接,可以更好地了解 Dart 和 Flutter 中的 Streams