Flutter 从initState返回导航';findAncestorStateOfType';被调用为空
我正在侦听initState中的数据库更改(firestore)。对于特定的更改,我需要将用户路由到另一个屏幕 我的初始状态函数:Flutter 从initState返回导航';findAncestorStateOfType';被调用为空,flutter,google-cloud-firestore,flutter-navigation,flutter-state,Flutter,Google Cloud Firestore,Flutter Navigation,Flutter State,我正在侦听initState中的数据库更改(firestore)。对于特定的更改,我需要将用户路由到另一个屏幕 我的初始状态函数: @override void initState() { super.initState(); FirebaseFirestore.instance .collection('groups') .where('members', arrayContains: globals.user.userId)
@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);
});
});
}
@覆盖
void initState(){
super.initState();
FirebaseFirestore.instance
.集合(“组”)
.where('members',arrayContains:globals.user.userId)
.限额(1)
.快照()
.听((事件){
event.docs.forEach((doc){
Navigator.of(context.pushName和removeUntil)(
“/GroupScreen',(路由)=>false);
});
});
}
有两种情况:
class主屏幕扩展StatefulWidget{
@凌驾
_MainScreen createState()=>\u MainScreen();
}
类_主屏幕扩展状态{
Future_prefs=SharedReferences.getInstance();
最终_scaffoldKey=新的GlobalKey();
List favoritGroupsList=List();
bool isLoading=true;
流(组)流;;
@凌驾
void initState(){
//TODO:实现initState
checkFirstScreen();
_groupsStream=FirebaseFirestore.instance
.集合(“组”)
.where('guests',arrayContains:globals.user.userId)
.orderBy('状态')
.快照();
如果(_groupsStream!=null){
FirebaseFirestore.instance
.集合(“组”)
.where('members',arrayContains:globals.user.userId)
.限额(1)
.快照()
.听((事件){
event.docs.forEach((doc){
joinUserToGroup(上下文,doc.id);
});
});
}
super.initState();
WidgetsBinding.instance.addPostFrameCallback(())=>{
initFunctions(),
网络().getAvailableFriends().then((值)=>showSnackBar())
});
}
void initFunctions()异步{
等待网络();
等待网络();
如果(本安装){
设置状态(){
isLoading=false;
});
}
}
@凌驾
小部件构建(构建上下文){
返回式示波器(
onWillPop:()async=>false,
孩子:脚手架(
钥匙:_scaffoldKey,
appBar:appBar(
.
.
.
),
);
}
joinUserToGroup(BuildContext上下文,字符串groupId){
globals.tempGroup.groupId=groupId;
Navigator.of(context.pushName和removeUntil)(
“/GroupScreen',(路由)=>false);
_groupsStream=null;
}
}
问题在于joinUserToGroup函数中的导航器。
谢谢!您应该等到数据可用,然后将代码放入这样一个具有未来前景的函数中
Future<viod> someFunction() async{
FirebaseFirestore.instance
.collection('groups')
.where('guests', arrayContains: globals.user.userId)
.snapshots()
.listen((event) {
event.docs.forEach((doc) {
if (doc['members'].contains(globals.user.userId)) {
SchedulerBinding.instance.addPostFrameCallback((_) {
Navigator.of(context).pushNamedAndRemoveUntil(
'/GroupScreen', (Route<dynamic> route) => false);
});
}
});
});
}
我认为这可能是可行的您应该等到数据可用时,然后将代码放入一个具有类似未来的函数中
Future<viod> someFunction() async{
FirebaseFirestore.instance
.collection('groups')
.where('guests', arrayContains: globals.user.userId)
.snapshots()
.listen((event) {
event.docs.forEach((doc) {
if (doc['members'].contains(globals.user.userId)) {
SchedulerBinding.instance.addPostFrameCallback((_) {
Navigator.of(context).pushNamedAndRemoveUntil(
'/GroupScreen', (Route<dynamic> route) => false);
});
}
});
});
}
我认为这可能是工作我发现你的问题在于
BuildContext
上下文,你在BuildContext
之外调用navigator,这就是为什么你会出现这个错误,所以你必须提供上下文,因为没有上下文你无法创建新的屏幕,也许这个链接可以帮助你
void someFunction(BuildContext){
FirebaseFirestore.instance
.集合(“组”)
.where('guests',arrayContains:globals.user.userId)
.快照()
.听((事件){
event.docs.forEach((doc){
if(doc['members'].contains(globals.user.userId)){
SchedulerBinding.instance.addPostFrameCallback((){
Navigator.of(context.pushName和removeUntil)(
“/GroupScreen',(路由)=>false);
});
}
});
});
}
void initState(){
super.initState();
someFunction();
}
我发现您的问题在于BuildContext
上下文,您在BuildContext
之外调用navigator,这就是为什么您会出现此错误,因此您必须提供上下文,因为没有上下文,您无法创建新屏幕。此链接可能会对您有所帮助
void someFunction(BuildContext){
FirebaseFirestore.instance
.集合(“组”)
.where('guests',arrayContains:globals.user.userId)
.快照()
.听((事件){
event.docs.forEach((doc){
if(doc['members'].contains(globals.user.userId)){
SchedulerBinding.instance.addPostFrameCallback((){
Navigator.of(context.pushName和removeUntil)(
“/GroupScreen',(路由)=>false);
});
}
});
});
}
void initState(){
super.initState();
someFunction();
}
您的代码下是否会出现类似红线的错误,因为您的代码在
您可以像下面的代码一样提供正确的参数
joinUserToGroup(BuildContext context, String groupId) {
globals.tempGroup.groupId = groupId;
return Navigator.pushNamedAndRemoveUntil(
context,
'/GroupScreen',
(route) => false);
},
_groupsStream = null;
}
}
我想这就是让你的应用程序正常运行所需要的一切。如果你遇到新的错误,请添加一条评论。你是否会在代码下出现任何类似红线的错误,因为你的代码在 您可以像下面的代码一样提供正确的参数
joinUserToGroup(BuildContext context, String groupId) {
globals.tempGroup.groupId = groupId;
return Navigator.pushNamedAndRemoveUntil(
context,
'/GroupScreen',
(route) => false);
},
_groupsStream = null;
}
}
我想这就是让你的应用程序正常运行所需的全部。如果你遇到新的错误,请添加一条评论我是通过在外部提供导航器来创建你的应用程序的,我遇到了相同的错误,因为你
joinUserToGroup(BuildContext context, String groupId) {
globals.tempGroup.groupId = groupId;
return Navigator.pushNamedAndRemoveUntil(
context,
'/GroupScreen',
(route) => false);
},
_groupsStream = null;
}
}