Firebase 如何使用颤振从错误对话框导航

Firebase 如何使用颤振从错误对话框导航,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,我用的是Firebase和Flatter。 在我以内容列表的形式检索文档之后,我不知道如何处理屏幕。代码在StreamBuilder中。 我想首先显示对话框,然后按下对话框OK按钮,导航到下一个屏幕 final List<DocumentSnapshot> contents = snapshot.data.documents; if (contents.length == 0) { try { print('NO DATA FOR THIS USER. ${conten

我用的是Firebase和Flatter。 在我以内容列表的形式检索文档之后,我不知道如何处理屏幕。代码在StreamBuilder中。 我想首先显示对话框,然后按下对话框OK按钮,导航到下一个屏幕

final List<DocumentSnapshot> contents = snapshot.data.documents;

if (contents.length == 0) {
  try {
    print('NO DATA FOR THIS USER. ${contents.length}');
    showDialog(
        context: context,
        builder: (_) {
          return AlertDialog(
            title: Text('Error'),
            content: Text('Please Register First.'),
            actions: <Widget>[
              FlatButton(
                child: Text('OK'),
                onPressed: () {
                   Navigator.push(context,
                     MaterialPageRoute(builder: (context) => NextPage()));
                    //Navigator.pop(context);
                },
              ),
            ],
          );
        });
  } catch (e) {
    return Container();
  }
}
下面的代码不会导航到下一个屏幕

final List<DocumentSnapshot> contents = snapshot.data.documents;

if (contents.length == 0) {
  try {
    print('NO DATA FOR THIS USER. ${contents.length}');
    showDialog(
        context: context,
        builder: (_) {
          return AlertDialog(
            title: Text('Error'),
            content: Text('Please Register First.'),
            actions: <Widget>[
              FlatButton(
                child: Text('OK'),
                onPressed: () {
                   Navigator.push(context,
                     MaterialPageRoute(builder: (context) => NextPage()));
                    //Navigator.pop(context);
                },
              ),
            ],
          );
        });
  } catch (e) {
    return Container();
  }
}
final List contents=snapshot.data.documents;
如果(contents.length==0){
试一试{
打印('此用户没有数据。${contents.length}');
显示对话框(
上下文:上下文,
建筑商:(){
返回警报对话框(
标题:文本(“错误”),
内容:文本('请先注册'),
行动:[
扁平按钮(
子项:文本('OK'),
已按下:(){
Navigator.push(上下文,
MaterialPage路由(生成器:(上下文)=>NextPage());
//Navigator.pop(上下文);
},
),
],
);
});
}捕获(e){
返回容器();
}
}
如果我不返回容器,将显示错误屏幕。

根据我的说法, 您应该从导航器堆栈中删除该对话框,然后执行MaterialPage路由。 这就是代码

showDialog的生成器参数需要类型为的参数

小部件功能(构建上下文)

因此,请尝试传递“context”作为参数,而不是下划线,如下所示

final List<DocumentSnapshot> contents = snapshot.data.documents;

if (contents.length == 0) {
  try {
    print('NO DATA FOR THIS USER. ${contents.length}');
    showDialog(
        context: context,
        builder: (context) {
          return AlertDialog(
            title: Text('Error'),
            content: Text('Please Register First.'),
            actions: <Widget>[
              FlatButton(
                child: Text('OK'),
                onPressed: () {
                   Navigator.pop(context);
                   Navigator.push(context,
                     MaterialPageRoute(builder: (context) => NextPage()));
                    //Navigator.pop(context);
                },
              ),
            ],
          );
        });
  } catch (e) {
    return Container();
  }
}
final List contents=snapshot.data.documents;
如果(contents.length==0){
试一试{
打印('此用户没有数据。${contents.length}');
显示对话框(
上下文:上下文,
生成器:(上下文){
返回警报对话框(
标题:文本(“错误”),
内容:文本('请先注册'),
行动:[
扁平按钮(
子项:文本('OK'),
已按下:(){
Navigator.pop(上下文);
Navigator.push(上下文,
MaterialPage路由(生成器:(上下文)=>NextPage());
//Navigator.pop(上下文);
},
),
],
);
});
}捕获(e){
返回容器();
}
}
根据我的说法, 您应该从导航器堆栈中删除该对话框,然后执行MaterialPage路由。 这就是代码

showDialog的生成器参数需要类型为的参数

小部件功能(构建上下文)

因此,请尝试传递“context”作为参数,而不是下划线,如下所示

final List<DocumentSnapshot> contents = snapshot.data.documents;

if (contents.length == 0) {
  try {
    print('NO DATA FOR THIS USER. ${contents.length}');
    showDialog(
        context: context,
        builder: (context) {
          return AlertDialog(
            title: Text('Error'),
            content: Text('Please Register First.'),
            actions: <Widget>[
              FlatButton(
                child: Text('OK'),
                onPressed: () {
                   Navigator.pop(context);
                   Navigator.push(context,
                     MaterialPageRoute(builder: (context) => NextPage()));
                    //Navigator.pop(context);
                },
              ),
            ],
          );
        });
  } catch (e) {
    return Container();
  }
}
final List contents=snapshot.data.documents;
如果(contents.length==0){
试一试{
打印('此用户没有数据。${contents.length}');
显示对话框(
上下文:上下文,
生成器:(上下文){
返回警报对话框(
标题:文本(“错误”),
内容:文本('请先注册'),
行动:[
扁平按钮(
子项:文本('OK'),
已按下:(){
Navigator.pop(上下文);
Navigator.push(上下文,
MaterialPage路由(生成器:(上下文)=>NextPage());
//Navigator.pop(上下文);
},
),
],
);
});
}捕获(e){
返回容器();
}
}

我明白了。我应该在屏幕显示之前插入此代码。 我在错误的地方实现了这个代码。这很难解释


然而,它起了作用

我明白了。我应该在屏幕显示之前插入此代码。 我在错误的地方实现了这个代码。这很难解释


然而,它起了作用

尝试在
catch
块中打印
e
,并回答它所说的内容。未处理的异常:“package:flatter/src/widgets/navigator.dart”:失败的断言:第2334行位置18:“!导航器。_debugLocked':不正确。@tajihiro在导航器之前添加
navigator.pop(上下文)
。按“如果我不返回容器”-从哪里返回?您发布的代码是
build()
方法或什么?@Crazy Lazy Cat的一部分,它不起作用。请尝试在
catch
块中打印该
e
,并回复它所说的内容。未处理的异常:“package:flifter/src/widgets/navigator.dart”:失败的断言:第2334行位置18:“!导航器。_debugLocked':不正确。@tajihiro在导航器之前添加
navigator.pop(上下文)
。按“如果我不返回容器”-从哪里返回?您发布的代码是
build()
方法或什么的一部分?@Crazy Lazy Cat它不起作用。您是否尝试在Navigator.push()之前添加Navigator.pop()?这是函数还是内部生成方法。如果在函数内部,请尝试将BuildContext构建作为参数传递,然后重试。如回答中所示,将ShowDialogue的builder参数中的下划线(“\”)更改为context。这可能会解决此问题。是否尝试在Navigator.push()之前添加Navigator.pop()?这是函数还是内部生成方法。如果在函数内部,请尝试将BuildContext构建作为参数传递,然后重试。如回答中所示,将ShowDialogue的builder参数中的下划线(“\”)更改为context。这可能会解决这个问题。