我制作了一個對話框,如果有人正確輸入某個單詞,該對話框可以關閉。我想知道如果有人在特定時間范圍內沒有在第一個文本框中輸入任何內容,是否可以顯示第二個對話框。例如,如果此人在接下來的 5 分鐘內沒有輸入文本,有沒有辦法觸發第二個對話框顯示?
Future.delayed(Duration(seconds: 5), () {
showDialog(
context: context,
barrierDismissible: false,
builder: (context) {
return AlertDialog(
title: Text('Your time finished'),
content: Text('Type "OKAY" if you want to go back to the homepage'),
actions: <Widget>[
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: TextFormField(
controller: _textEditingController,
validator: (String? word){
if (word != OKAY){
_NoDialog();
}
else{
Navigator.pop(context);
}
},
),
),
],
);
});
});
NoDialog如果此人提供的文本不正確,我會呼叫該函式,但如果此人在一段時間內未在文本框中輸入任何內容,我不確定如何進行“if”陳述句。我想我可以做一個“if”陳述句,如果這個人將文本留空,然后呼叫一個附加了 Future.delayed 的新函式,但我找不到一種方法來為沒有文本的情況做一個“if”陳述句進入。同樣在這種情況下,我相信該人必須按“回車”鍵,但我希望顯示第二個對話框,因為用戶沒有觸摸螢屏上的任何內容。這可能嗎?
uj5u.com熱心網友回復:
在簡單的情況下,您可以通過傳遞相同的構建背景關系來顯示嵌套重疊對話框。
第一個對話框將是
_userInputCheckerDialog({
required BuildContext context,
required String correctText,
Duration maxTime = const Duration(seconds: 2),
}) async {
bool _noInteraction = true;
/// apear if user doesnt type anything within
Future.delayed(maxTime).then((t) async {
if (_noInteraction) await _showSecondDialog(context);
});
await showDialog(
context: context,
barrierDismissible: false,
builder: (context) {
return StatefulBuilder(
///may need in future to change variable inside dialog
builder: (context, setStateSB) {
return AlertDialog(
content: TextField(
onChanged: (value) async {
_noInteraction = false;
if (value == correctText) {
Navigator.of(context)
.pop(); // close after getting currect text
}
},
),
);
},
);
},
);
}
然后內部對話具有相同的背景關系
_showSecondDialog(BuildContext context) async {
await showDialog(
context: context,
builder: (context) => const AlertDialog(
content: Text("Hey start typing"),
),
);
}
這只是檢查用戶互動的第一次。
如果你想使用時間框架,我們需要使用 async 包來取消(不是真的取消)未來。你可能會覺得它比第一個復雜一點。
使用異步
_showSecondDialog(BuildContext context) async {
await showDialog(
context: context,
builder: (context) => const AlertDialog(
content: Text("Hey start typing"),
),
);
}
CancelableOperation _restartTimer({
CancelableOperation? cancelableOperation,
Duration duration = const Duration(seconds: 4),
required BuildContext context,
}) {
if (cancelableOperation != null) {
cancelableOperation.cancel();
cancelableOperation = null;
}
cancelableOperation = CancelableOperation.fromFuture(
Future.delayed(
duration,
),
).then((p0) async {
await _showSecondDialog(context);
});
return cancelableOperation;
}
_userInputCheckerDialog({
required BuildContext context,
required String correctText,
Duration maxTime = const Duration(seconds: 2),
}) async {
CancelableOperation? _cancelableOperation;
///start timer at startUp
_cancelableOperation = _restartTimer(
context: context,
cancelableOperation: _cancelableOperation,
duration: maxTime,
);
await showDialog(
context: context,
barrierDismissible: false,
builder: (context) {
return StatefulBuilder(
///may need in future to change variable inside dialog
builder: (context, setStateSB) {
return AlertDialog(
content: TextField(
onChanged: (value) async {
_cancelableOperation = _restartTimer(
context: context,
cancelableOperation: _cancelableOperation);
if (value == correctText) {
_cancelableOperation!.cancel();
Navigator.of(context)
.pop(); // close after getting currect text
}
},
),
);
},
);
},
);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/364093.html
上一篇:我在下拉選單中收到值選擇錯誤
