我正在 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;
}
}
问题出在 Navigator 中的 joinUserToGroup 函数中。谢谢!