Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 从警报对话框显示snackbar_Flutter - Fatal编程技术网

Flutter 从警报对话框显示snackbar

Flutter 从警报对话框显示snackbar,flutter,Flutter,我对这个感到困惑。所以我知道,要显示快餐店,您必须能够访问其祖先是脚手架的构建上下文。为了解决这个问题,我通常只在scaffold中创建一个单独的小部件,在其中可以调用新的构建上下文。然而,当我使用警报对话框时,我似乎无法让它工作 我在脚手架下制作的“儿童”小部件如下所示: class DeleteButton extends StatelessWidget { DeleteButton({@required this.vm, @required this.popCallback});

我对这个感到困惑。所以我知道,要显示快餐店,您必须能够访问其祖先是脚手架的构建上下文。为了解决这个问题,我通常只在scaffold中创建一个单独的小部件,在其中可以调用新的构建上下文。然而,当我使用警报对话框时,我似乎无法让它工作

我在脚手架下制作的“儿童”小部件如下所示:

class DeleteButton extends StatelessWidget {
  DeleteButton({@required this.vm, @required this.popCallback});

  final AddJobVM vm;
  final Function popCallback;

  @override
  Widget build(BuildContext context) {
    final continueCallBack = () async {
      print("deleting ${vm.jobName}");
      ToasterBundle toast;
      toast = await vm.deleteJob();
      print(toast.success);
      Scaffold.of(context).showSnackBar(generateSnackBar(toast));
      await Future.delayed(
        Duration(seconds: 2),
      );
      if (toast.success) {
        popCallback();
      }
    };
    return Padding(
      padding: EdgeInsets.only(right: kStandardPadding),
      child: GestureDetector(
        onTap: () {
          showDialog(
              context: context,
              builder: (context) {
                return AlertDialogueBlurredBG(
                  title: 'Delete Job',
                  content: 'Are you sure you want to delete this job?',
                  continueCallBack: continueCallBack,
                );
              });
        },
        child: Icon(
          Icons.delete_outline,
          color: kColorWhite,
          size: 28,
        ),
      ),
    );
  }
}
但是当我调用“continueCallBack”时,我得到了一个错误:

[VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: Looking up a deactivated widget's ancestor is unsafe.
At this point the state of the widget's element tree is no longer stable.
To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.
#0      Element._debugCheckStateIsActiveForAncestorLookup.<anonymous closure> (package:flutter/src/widgets/framework.dart:3781:9)
#1      Element._debugCheckStateIsActiveForAncestorLookup (package:flutter/src/widgets/framework.dart:3795:6)
#2      Element.findAncestorStateOfType (package:flutter/src/widgets/framework.dart:3914:12)
#3      Scaffold.of (package:flutter/src/material/scaffold.dart:1453:42)
#4      DeleteButton.build.<anonymous closure> (package:upworkv2/screens/jobs/add_edit_job_screen.dart:615:16)
<asynchronous suspension>
#5      DeleteButton.build.<anonymous closure> (package:upworkv2/screens/jobs/add_edit_job_scree<…>
[VERBOSE-2:ui\u dart\u state.cc(157)]未处理的异常:查找停用小部件的祖先是不安全的。
此时,小部件元素树的状态不再稳定。
要在dispose()方法中安全地引用小部件的祖先,请通过在小部件的didChangeDependencies()方法中调用dependOnInheritedWidgetOfExactType()保存对祖先的引用。
#0元素。\u debugcheckstatesactiveforancestorlookup。(包:flatter/src/widgets/framework.dart:3781:9)
#1元素。_debugcheckstatesactiveforancestorlookup(包:flatter/src/widgets/framework.dart:3795:6)
#2 Element.findAncestorStateOfType(包:flatter/src/widgets/framework.dart:3914:12)
#3.of脚手架(包装:颤振/src/材料/脚手架。dart:1453:42)
#4.DeleteButton.build。(软件包:upworkv2/screens/jobs/add\u edit\u job\u screen.dart:615:16)
#5.DeleteButton.build。(软件包:upworkv2/屏幕/作业/添加\编辑\作业\屏幕

我本以为使用在警报对话框之外引用构建上下文的回调会起到作用,但没有任何效果。关于我在这里哪里出错的任何想法?

Builder
小部件在这种情况下会有所帮助,只要看看我如何使用和实现它

body: Builder(
        builder: (BuildContext innerContext) {
          return RaisedButton(
            onPressed: () {
              showDialog(
                context: context,
                builder: (context) => AlertDialog(
                  title: Text('Are you sure?'),
                  content: Text('Do you want to go to background?'),
                  actions: <Widget>[
                    FlatButton(
                        onPressed: () => Navigator.of(context).pop(),
                        child: Text('NO')),
                    FlatButton(
                        onPressed: () {
                          Scaffold.of(innerContext).showSnackBar(SnackBar(
                            content: Text('Added added into cart'),
                            duration: Duration(seconds: 2),
                            action:
                                SnackBarAction(label: 'UNDO', onPressed: () {}),
                          ));
                        },
                        child: Text('YES'))
                  ],
                ),
              );
            },
          );
        },
      ),
body:Builder(
生成器:(BuildContext-innerContext){
返回上升按钮(
已按下:(){
显示对话框(
上下文:上下文,
生成器:(上下文)=>AlertDialog(
标题:文本(“你确定吗?”),
内容:文本('是否要转到背景?'),
行动:[
扁平按钮(
onPressed:()=>Navigator.of(context.pop(),
子项:文本(“否”),
扁平按钮(
已按下:(){
Scaffold.of(innerContext).showSnackBar(SnackBar(
内容:文本(“添加到购物车中”),
持续时间:持续时间(秒数:2),
行动:
SnackBarAction(标签:“UNDO”,按下时:({}),
));
},
子项:文本('YES'))
],
),
);
},
);
},
),

发生此异常是因为您使用的是实例化Scaffold的小部件的上下文,而不是Scaffold子部件的上下文

输出:


Builder
小部件在这种情况下会有所帮助,请看我如何使用和实现它

body: Builder(
        builder: (BuildContext innerContext) {
          return RaisedButton(
            onPressed: () {
              showDialog(
                context: context,
                builder: (context) => AlertDialog(
                  title: Text('Are you sure?'),
                  content: Text('Do you want to go to background?'),
                  actions: <Widget>[
                    FlatButton(
                        onPressed: () => Navigator.of(context).pop(),
                        child: Text('NO')),
                    FlatButton(
                        onPressed: () {
                          Scaffold.of(innerContext).showSnackBar(SnackBar(
                            content: Text('Added added into cart'),
                            duration: Duration(seconds: 2),
                            action:
                                SnackBarAction(label: 'UNDO', onPressed: () {}),
                          ));
                        },
                        child: Text('YES'))
                  ],
                ),
              );
            },
          );
        },
      ),
body:Builder(
生成器:(BuildContext-innerContext){
返回上升按钮(
已按下:(){
显示对话框(
上下文:上下文,
生成器:(上下文)=>AlertDialog(
标题:文本(“你确定吗?”),
内容:文本('是否要转到背景?'),
行动:[
扁平按钮(
onPressed:()=>Navigator.of(context.pop(),
子项:文本(“否”),
扁平按钮(
已按下:(){
Scaffold.of(innerContext).showSnackBar(SnackBar(
内容:文本(“添加到购物车中”),
持续时间:持续时间(秒数:2),
行动:
SnackBarAction(标签:“UNDO”,按下时:({}),
));
},
子项:文本('YES'))
],
),
);
},
);
},
),

发生此异常是因为您使用的是实例化Scaffold的小部件的上下文,而不是Scaffold子部件的上下文

输出:


“发生此异常是因为您使用的是实例化Scaffold的小部件的上下文,而不是Scaffold子部件的上下文。”但事实并非如此,我发布的小部件是一个无状态小部件,在脚手架中有自己的构建上下文,因此它在脚手架实例化后使用上下文。是的,它仍然给我错误:未处理的异常:查找停用小部件的祖先是不安全的。“发生此异常是因为您使用的是实例化Scaffold的小部件的上下文,而不是Scaffold子部件的上下文。“但事实并非如此,我发布的小部件是一个无状态小部件,在脚手架中有自己的构建上下文,因此它在脚手架实例化后使用上下文。是的,它仍然会给我错误:未处理的异常:查找停用小部件的祖先是不安全的。