【问题标题】:Showing snackbar from alert dialog从警报对话框显示快餐栏
【发布时间】:2020-11-04 19:03:38
【问题描述】:

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

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

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<…>

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

【问题讨论】:

    标签: flutter


    【解决方案1】:

    Builder Widget 在这种情况下会有所帮助,看看我是如何使用和实现它的,

    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'))
                      ],
                    ),
                  );
                },
              );
            },
          ),
    

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

    输出:

    【讨论】:

    • "发生此异常是因为您正在使用实例化 Scaffold 的小部件的上下文。而不是 Scaffold 子项的上下文。"但这不是真的,我发布的小部件是一个无状态小部件,在脚手架内有自己的构建上下文,所以它在脚手架实例化后使用上下文。
    • 是的,它仍然给我错误:未处理的异常:查找已停用小部件的祖先是不安全的。
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多