当我退出flutter应用程序并尝试再次登录时,我收到此错误:
状态错误(错误状态:流已被收听。)
给我这个错误的代码在我的第一页:
@override
void initState() {
AwesomeNotifications().actionStream.listen((notification) async {
if (notification.channelKey == 'scheduled_channel') {
var payload = notification.payload['payload'];
var value = await FirebaseFirestore.instance
.collection(widget.user.uid)
.doc(payload)
.get();
navigatorKey.currentState.push(PageRouteBuilder(
pageBuilder: (_, __, ___) => DetailPage(
user: widget.user,
i: 0,
docname: payload,
color: value.data()['color'].toString(),
createdDate: int.parse((value.data()['date'].toString())),
documentId: value.data()['documentId'].toString(),)));
}
});
super.initState();
}
和包含注销代码的另一页上。
await FirebaseAuth.instance.signOut();
if (!mounted) return;
Navigator.pushNamedAndRemoveUntil(context,
"/login", (Route<dynamic> route) => false);
我能做些什么来解决这个问题?当我注销时是否可以停止收听actionstream?或者我应该用另一种方法来做?
1条答案
按热度按时间0kjbasz61#
流是一次性使用的,它们取代了UI的回调,一开始一次性使用的流看起来毫无用处,但这可能是缺乏远见。总之(至少对我来说)flutter提供了所有必要的小部件来避免流的混乱,你可以在ChangeNotifier的 Implementers 部分找到它们,所有这些都实现了
TextEditingController
之类的其他小部件。因此,理想的做法(同样,至少对我来说)是将小部件视为集群,其中流只是将它们捆绑在一个用例中,例如,小部件
StreamBuilder
被设计为按需 * 构建 *,因此它只需要一些东西来泵送更改,以形成一个 “活对象”,就像在时钟中一样,一个周期函数向流添加新值,小部件只需要侦听和更新。为了解决你的问题,你可以让
.actionStream
适合你正在使用它的情况,或者稍微改变一下你是如何使用它的(有一个猴子补丁是不好的,但你决定是否值得)。这个例子并不完全是一个 “这是什么是错误的,修复它”,它更多的是展示如何使用
pushNamedAndRemoveUntil
和StreamSubscription
可以得到实现。我也使用了InheritedWidget
,只是因为它在这种情况下是如此有用。有一件事你应该检查多一点是变量count
不停止递增时,route_a
是焦点。流是独立的,只要小部件还在,它就将是活动的,在您的情况下,重建侦听小部件是错误的。