【问题标题】:Flutter - use WillPopScope with custom dialog to confirm app exitFlutter - 使用带有自定义对话框的 WillPopScope 来确认应用退出
【发布时间】:2021-02-04 10:19:09
【问题描述】:

我已经通过这种方式实现了应用退出确认:

 return WillPopScope(
      onWillPop: _promptExit,
      child: Container() /*Remaining window layout*/

_promptExit 函数显示对话框以确认退出:

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,所以我尝试了这种方式:

 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;

但我不能这样弹出,我正在黑屏。我该怎么办?

【问题讨论】:

    标签: flutter dart dialog


    【解决方案1】:

    showDialog 不会弹出对话框本身。所以需要使用Navigator.of(context).pop()并获取返回值。

    awesomeDialogs 包装 pop() 函数本身,对返回值不做任何事情 (awesome_dialog.dart)

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

    所以需要自己处理返回值,不要再使用pop():

    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】:

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

      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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多