问题描述
我正在监听initState中的数据库更改(firestore)。在特定更改上,我需要将用户路由到另一个屏幕。
我的initState函数:
@override
void initState() {
super.initState();
FirebaseFirestore.instance
.collection('groups')
.where('members',arrayContains: globals.user.userId)
.limit(1)
.snapshots()
.listen((event) {
event.docs.forEach((doc) {
Navigator.of(context).pushNamedAndRemoveUntil(
'/GroupScreen',(Route<dynamic> route) => false);
});
});
}
有两种情况:
- 第一个是数据库更改在用户打开应用前之前生效。然后,当用户打开应用程序时,他会直接路由到另一个屏幕,没有问题。
- 另一方面,当应用程序打开且数据库更改生效时,用户将重定向到另一个屏幕,并出现上述错误:
调度程序库捕获的异常方法 在null上调用了'findAncestorStateOfType'。接收者:null已尝试 调用:findAncestorStateOfType()
我不明白为什么错误仅在第二种情况下有效。
请帮助我弄清楚我在做什么错。 预先感谢。
其他信息(完整代码):
class MainScreen extends StatefulWidget {
@override
_MainScreen createState() => _MainScreen();
}
class _MainScreen extends State<MainScreen> {
Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
final _scaffoldKey = new GlobalKey<ScaffoldState>();
List<String> favoritGroupsList = List<String>();
bool isLoading = true;
Stream _groupsStream;
@override
void initState() {
// TODO: implement initState
checkFirstScreen();
_groupsStream = FirebaseFirestore.instance
.collection('groups')
.where('guests',arrayContains: globals.user.userId)
.orderBy('status')
.snapshots();
if (_groupsStream != null) {
FirebaseFirestore.instance
.collection('groups')
.where('members',arrayContains: globals.user.userId)
.limit(1)
.snapshots()
.listen((event) {
event.docs.forEach((doc) {
joinUserToGroup(context,doc.id);
});
});
}
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) => {
initFunctions(),Network().getAvailableFriends().then((value) => showSnackBar())
});
}
void initFunctions() async {
await Network().getAllUser();
await Network().getUser();
if (this.mounted) {
setState(() {
isLoading = false;
});
}
}
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async => false,child: Scaffold(
key: _scaffoldKey,appBar: AppBar(
.
.
.
),);
}
joinUserToGroup(BuildContext context,String groupId) {
globals.tempGroup.groupId = groupId;
Navigator.of(context).pushNamedAndRemoveUntil(
'/GroupScreen',(Route<dynamic> route) => false);
_groupsStream = null;
}
}
问题出在导航器的joinUserToGroup函数中。 谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)