首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DisMissState.build.<anonymous closure>.<anonymous closure>

DisMissState.build.<anonymous closure>.<anonymous closure>
EN

Stack Overflow用户
提问于 2021-12-15 14:58:35
回答 3查看 1.4K关注 0票数 1

当我试图删除该项目时,我遇到了问题,而它不接受删除该项目。我正在使用ConfirmDismiss。

错误:

未处理异常:类型'Null‘不是'bool' _DisMissState.build的子类型。(package:advanced_part_2/dismissible.dart:84:30) _DismissibleState._handleDismissStatusChanged (package:flutter/src/widgets/dismissible.dart:498:11)

代码:

代码语言:javascript
复制
 confirmDismiss: (DismissDirection dir) async {
                if (dir == DismissDirection.startToEnd) {
              //    AlertDialog ad =
                  final bool res = await showDialog(
                    context: context,
                    builder: (BuildContext context) {
                      return AlertDialog(
                        content: Text('Are You Sure you want to delete'),
                        actions:<Widget> [
                          ElevatedButton(
                              onPressed: () {
                                Navigator.of(context).pop();
                              },
                              child: Text(
                                'cancel',

                              )),
                          ElevatedButton(
                              onPressed: () {
                                setState(() {
                                  genList.removeAt(index);
                                });
                                Navigator.of(context).pop();
                              },
                              child: Text(
                                'Delete',
                                style: TextStyle(color: Colors.red),
                              ))
                        ],
                      );
                    },
                  );
                  return res;
                } else {
                  return true;
                }
              },
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-12-15 15:12:47

这是因为当调用以下代码时:

代码语言:javascript
复制
final bool res = await showDialog(...);

它将返回一个空值,请参阅https://api.flutter.dev/flutter/material/showDialog.html

而且,单击该按钮时也不会给出任何返回值:

代码语言:javascript
复制
ElevatedButton(
     onPressed: () {
        Navigator.of(context).pop();
      },
      child: Text(
        'cancel',

      )),

你不能使用Navigator.of(context).pop();。相反,您需要使用以下两种方法:

代码语言:javascript
复制
Navigator.pop(context, false);

代码语言:javascript
复制
Navigator.pop(context, true);

然后,您需要处理显示对话框中的可空返回值,方法是在null时提供一个默认值。就像这样:

代码语言:javascript
复制
bool res = await showDialog(...);
if(res == null) res = false;
票数 0
EN

Stack Overflow用户

发布于 2021-12-15 15:06:47

当对话框被取消时,showDialog可以返回null (例如,用户在对话框外单击),因此您必须通过将类型更改为:

代码语言:javascript
复制
final bool? res = await showDialog(/* your code */);

然后在下面的逻辑中,您必须检查null:

代码语言:javascript
复制
if(res == null) {
 // handle dismiss
} else if (res == false) {
 // handle cancel
} else {
 // handle confirm/true
}

正如注释中提到的@Er1 1一样,在弹出对话框时还需要传递truefalse

代码语言:javascript
复制
Navigator.of(context).pop(true);
// or
Navigator.of(context).pop(false);

上述情况仍然适用,因为默认情况下barrierDismissibletrue

票数 0
EN

Stack Overflow用户

发布于 2021-12-15 15:09:13

代码语言:javascript
复制
final bool res = await showDialog(
                    context: context,
                    barrierDismissible: false,
                    builder: (BuildContext context) {
                      return AlertDialog(
                        content: Text('Are You Sure you want to delete'),
                        actions:<Widget> [
                          ElevatedButton(
                              onPressed: () {
                                Navigator.of(context).pop(false);
                              },
                              child: Text(
                                'cancel',

                              )),
                          ElevatedButton(
                              onPressed: () {
                                setState(() {
                                  genList.removeAt(index);
                                });
                                Navigator.of(context).pop(true);
                              },
                              child: Text(
                                'Delete',
                                style: TextStyle(color: Colors.red),
                              ))
                        ],
                      );
                    },
                  );

falsetrue添加到pop()中,使showDialog返回布尔值。

但是,请记住,如果不将barrierDismissibleshowDialog中设置为false,则如果在对话框之外单击,则可以返回null

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70365843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档