gpt4 book ai didi

android - Flutter-SchedulerBinding,showDialoag,AlertDialog和WillPopScope的问题组合

转载 作者:行者123 更新时间:2023-12-03 03:52:50 24 4
gpt4 key购买 nike

我有一个AlertDialog,当转到新屏幕时会立即出现。它具有BACK和GO按钮。仅在用户按GO时关闭AlertDialog时,我需要保留在此屏幕中。如果用户按BACK按钮或BACK Android Button,则需要转到上一个屏幕,而不要保留在当前屏幕中。
当我关闭AlertDialog时,如果可以,则使用Navigator.pop(context,false),如果使用BACK,则使用boolean返回类型,如果使用BACK,则使用boo。返回返回上一个屏幕。

  @override
void initState() {
super.initState();
SchedulerBinding.instance.addPostFrameCallback(
(_) => _showDialog().then((isScreenToPop) {
//ERROR: Unhandled Exception: Failed assertion: boolean expression must not be null
if (isScreenToPop) {
Navigator.pop(context);
} else {
setState(() {});
}
}),
);
}

现在,我需要检测“返回Android按钮”上的点击。为此,我将WillPopScope与Future.value(true)一起使用,但是此方法返回null,并且使用第二个Navigator.pop(context)的评估返回Unhandled Exception:失败的断言: bool(boolean) 表达式不能为null。
  Future<bool> _showADialog() {
return showDialog(
context: context,
barrierDismissible: false,
builder: (_) {
return WillPopScope(
onWillPop: () async {
//THIS RETURN NULL AND NOT Future<true>
return Future.value(true);
},
child: StatefulBuilder(
builder: (context, setState) {
return AlertDialog(
actions: <Widget>[
FlatButton(
child: Text('BACK'),
onPressed: () {
Navigator.pop<bool>(context, true);
},
),
FlatButton(
child: Text('OK'),
onPressed: () {
Navigator.pop<bool>(context, false);
},
),
],
);
},
),
);
},
);
}

现在的临时解决方案如下,但我不喜欢。
        if (isScreenToPop == null || isScreenToPop) {
Navigator.pop(context);
} else {
setState(() {});
}

最佳答案

只返回true而不是Future.value(true)。当您使用async时,返回值将自 Action 为Future返回。

另外,如果您需要多次使用pop,请查看其他pop函数,例如popUntil

关于android - Flutter-SchedulerBinding,showDialoag,AlertDialog和WillPopScope的问题组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62438720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com