我的应用程序结构有点混乱,但我必须先添加这个补丁,然后重新构建整个逻辑。问题是,我首先检查是否有firebase用户,然后如果有,我使用StreamBuilder从Firestore获取当前用户配置文件,然后我使用_firebaseMessaging.config方法,因为在onLaunch和onResume上我使用这个回调:
void _navigateToGestorResevas(Map<String, dynamic> message, User currentUser) {
Navigator.push(context,
MaterialPageRoute(builder: (context) =>
GestorScreen(user: currentUser)));
}
因为我需要将用户发送到这个屏幕,他在那里从firebase获取消息。onResume这很好,但在Launch上,它会进入屏幕并获取数据,但大约有20秒的时间出现某种故障。它在两个状态之间切换20-30次,在这两个状态中我有和没有快照数据。_initState函数:
final snapshot = await _dbRef.child('mensajes').child(widget.user.id).once();
if (snapshot.value != null) {
setState(() {
hayMensajes = true;
});
final data = snapshot.value;
for (var entry in data.entries) {
Message message = Message.fromJson(entry.value);
setState(() {
message.add(message);
});
}
} else {
setState(() {
hayMensajes = false;
});
}
有人知道我做错了什么吗?
如果我没有错的话,FCMonLaunch
回调有一些活跃的问题。其中一些问题仍未解决。大多数人不得不面对的问题之一是onLaunch
回调被多次调用。我不知道为什么会发生这种情况,但就像你的情况一样,你可以通过一些临时修复来解决这个问题。
如果同一个屏幕被反复推送,出现故障,您可以弹出堆栈,直到它到达您想要打开的那个,并设置一个条件,仅当新路线与旧路线不同时才推送导航器。使用命名路线,
Navigator.popUntil(context, ModalRoute.withName(routeName));
if (ModalRoute.of(context).settings.name != routeName) {
Navigator.pushNamed(context, routeName);
}
我不确定这是否是你问的问题,但我希望至少我的回答能有所帮助。