我需要处理我的一个Form条目小部件上的后退按钮按下。这就是我实现WillPopScope的onWillPop方法的方式:
.PHONY : gen_files fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : clean clearscr all
clearscr:
clear
gen_files:
$(MAKE) -C ANOTHER_DIR_WHICH_GENERATES_FILE_NEEDED_BY_EXECUTABLE
这部分代码正常工作,但出现异常:
Future<bool> _onWillPop() {
if (changed) {
return showDialog(
context: context,
builder: (context) => new AlertDialog(
title: new Text('Save'),
content: new Text("Do you want to save the changes?"),
actions: <Widget>[
new FlatButton(
onPressed: () => Navigator.of(context).pop(true),
child: new Text('No'),
),
new FlatButton(
onPressed: () {
Navigator.of(context).pop(false);
saveMeeting();
},
child: new Text('Yes'),
),
],
),
) ??
false;
} else {
print("No changes");
Navigator.of(context).pop(true);
//return some future null from here ????
}
}
我该如何正确实施?
答案 0 :(得分:5)
我遇到了完全相同的问题。
我通过返回Future.value(false);解决了它。如果值为true,则显示黑屏。
Select
Sum(`Unit Price`) as TotalPrice,
Count(`Order ID`) as NumOfDiffProds,
Avg(`Quantity`) as AvgQuantity,
Avg(`Discount`) as AvgDiscount
From
`Order Details`
Where
`Order ID` = 1
答案 1 :(得分:1)
导入“ dart:async”包, 并将async关键字添加到您的方法签名中,例如
Future<bool> _onWillPop() async{
此后,只要您的方法像其他任何函数一样完成处理,就只需要返回一个布尔值
答案 2 :(得分:1)
您的评论:我需要在按下“后退”按钮时显示警报。 如果用户对数据进行了任何更改,则更改将变为true 而且那时我只需要显示警报。
您不必检查。
您可以参考以下示例(摘自here you can see a complete example的官方材料示例)并了解一些想法:
import 'package:flutter/material.dart';
import 'dart:async';
bool _formWasEdited = false;
final GlobalKey<FormState> _formKey = new GlobalKey<FormState>();
Future<bool> _warnUserAboutInvalidData() async {
final FormState form = _formKey.currentState;
if (form == null || !_formWasEdited || form.validate())
return true;
return await showDialog<bool>(
context: context,
builder: (BuildContext context) {
return new AlertDialog(
title: const Text('This form has errors'),
content: const Text('Really leave this form?'),
actions: <Widget> [
new FlatButton(
child: const Text('YES'),
onPressed: () { Navigator.of(context).pop(true); },
),
new FlatButton(
child: const Text('NO'),
onPressed: () { Navigator.of(context).pop(false); },
),
],
);
},
) ?? false;
}
在Form
小部件中:
child: new Form(
key: _formKey,
autovalidate: _autovalidate,
onWillPop: _warnUserAboutInvalidData,
//........