Во-первых, понятия async/await
и then
в основном одинаковы. Многие люди говорят, что async/await
- более элегантный способ справиться с Обещаниями (потому что он выглядит более структурированным). Обе идеи делают: «Сделай что-нибудь, и когда это будет сделано, сделай что-нибудь еще».
Относительно Future<void> copyToClipboard(BuildContext context, String text) async {...}
: Здесь вы возвращаете обещание из вашей функции. Это означает, что вы можете вызвать функцию откуда-то еще с помощью
await copyToClipboard(context,"Text");
print("Done");
Вы можете, однако, также вернуть само Обещание (а затем обработать его, где бы вы ни вызывали эту функцию):
Future<void> copyToClipboard(BuildContext context, String text) async {
return Clipboard.setData(ClipboardData(text: text));
}
void somewhereElse() async{
await copyToClipboard(context,"Text"); // (1)
print("Copied"); //Happens after (1)
}
Таким образом, если вы используете then
, вы поместите следующие инструкции в соответствующую функцию, вызываемую ею (как показано в третьем фрагменте). Решение второго фрагмента с помощью asyn c будет выглядеть следующим образом:
void copyToClipboard(BuildContext context, String text) async {
await Clipboard.setData(ClipboardData(text: text));// (1)
showSnackBar(context, 'Copied to clipboard')); // (2) This will only be called when (1) has completed
}
Если эта инструкция выдает ошибку, вы можете заключить ее в блок try / catch:
void copyToClipboard(BuildContext context, String text) async {
try{
await Clipboard.setData(ClipboardData(text: text));// (1)
showSnackBar(context, 'Copied to clipboard')); // (2) This will only be called when (1) has completed
}catch (error) {
print(error.message);
}
}
Если вы предпочитаете, то / wait или async / await - решать вам. Я бы порекомендовал async / await. Имейте в виду, что при использовании async / await вам необходимо поместить ключевое слово async
в сигнатуру функции, чтобы функции, вызывающие эту функцию, знали, что ее вызов может занять некоторое время и ждать его.