首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >颤振-使用WillPopScope和自定义对话框确认应用程序退出。

颤振-使用WillPopScope和自定义对话框确认应用程序退出。
EN

Stack Overflow用户
提问于 2021-02-04 10:19:09
回答 2查看 1.7K关注 0票数 1

我以这样的方式实现了app退出确认:

代码语言:javascript
复制
 return WillPopScope(
      onWillPop: _promptExit,
      child: Container() /*Remaining window layout*/

_promptExit功能显示对话框以确认退出:

代码语言:javascript
复制
return showDialog(
      context: context,
      builder: (context) => new AlertDialog(
        shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(20.0))),
        title: new Text(Strings.prompt_exit_title),
        content: new Text(Strings.prompt_exit_content),
        actions: <Widget>[
          FlatButton(
            child: new Text(Strings.no),
            onPressed: () => Navigator.of(context).pop(false),
          ),
          SizedBox(height: 16),
          FlatButton(
            child: new Text(Strings.yes),
            onPressed: () => Navigator.of(context).pop(true),
          ),
        ],
      ),
    ) ??
        false;

它可以工作,但我希望使用自定义对话框,而不是标准对话框:https://github.com/marcos930807/awesomeDialogs

它在内部调用showDialog,因此我尝试这样做:

代码语言:javascript
复制
 AwesomeDialog dlg = AwesomeDialog(
      context: context,
      dialogType: DialogType.QUESTION,
      animType: AnimType.BOTTOMSLIDE,
      title: Strings.prompt_exit_title,
      desc: Strings.prompt_exit_content,
      dismissOnBackKeyPress: false,
      useRootNavigator: true,
      btnCancelOnPress: () {  Navigator.of(context).pop(false);},
      btnOkOnPress: () {   Navigator.of(context).pop(true);},
      btnOkText: Strings.yes,
      btnCancelText: Strings.no
    );

    return dlg.show() ?? false;

但我不能这样弹,我的屏幕变黑了。我该怎么办?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-04 11:09:00

是的,你是对的。所以它应该是这样的:

代码语言:javascript
复制
Future<bool> _promptExit()  async {

    bool canExit;

    AwesomeDialog dlg = AwesomeDialog(
      context: context,
      dialogType: DialogType.QUESTION,
      animType: AnimType.BOTTOMSLIDE,
      title: Strings.prompt_exit_title,
      desc: Strings.prompt_exit_content,
      dismissOnTouchOutside: true,
      btnCancelOnPress: () => canExit = false,
      btnOkOnPress: () => canExit = true,
      btnOkText: Strings.yes,
      btnCancelText: Strings.no
    );

    await dlg.show();
    return Future.value(canExit);
}
票数 2
EN

Stack Overflow用户

发布于 2021-02-04 11:01:36

showDialog本身不会弹出对话框。因此,您需要使用Navigator.of(context).pop()并获得返回值。

awesomeDialogs包装pop()函数本身,不对返回值(dialog.dart)做任何操作。

代码语言:javascript
复制
   ...
    pressEvent: () {
      dissmiss();
      btnOkOnPress?.call();
    },
   ...
    pressEvent: () {
      dissmiss();
      btnCancelOnPress?.call();
    },
   ...

dissmiss() {
  if (!isDissmisedBySystem) Navigator.of(context, rootNavigator:useRootNavigator)?.pop();
}
...

因此,您需要自己处理返回值,不要再次使用pop():

代码语言:javascript
复制
var result;

AwesomeDialog dlg = AwesomeDialog(
  context: context,
  dialogType: DialogType.QUESTION,
  animType: AnimType.BOTTOMSLIDE,
  title: Strings.prompt_exit_title,
  desc: Strings.prompt_exit_content,
  dismissOnBackKeyPress: false,
  useRootNavigator: true,
  btnCancelOnPress: () {result = false;},
  btnOkOnPress: () {result = true;},
  btnOkText: Strings.yes,
  btnCancelText: Strings.no
);

await dlg.show();

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

https://stackoverflow.com/questions/66043613

复制
相关文章

相似问题

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