Будущее <void>, asyn c, ждите, затем catchError в Flutter / Dart - PullRequest
0 голосов
/ 07 марта 2020

В чем разница между:

Future , asyn c, дождитесь, затем catchError

Future<void> copyToClipboard(BuildContext context, String text) async {
  await Clipboard.setData(ClipboardData(text: text))
      .then((_) => showSnackBar(context, 'Copied to clipboard'))
      .catchError((Object error) => showSnackBar(context, 'Error $error'));
}

void, asyn c, подождите, затем catchError

void copyToClipboard(BuildContext context, String text) async {
  await Clipboard.setData(ClipboardData(text: text))
      .then((_) => showSnackBar(context, 'Copied to clipboard'))
      .catchError((Object error) => showSnackBar(context, 'Error $error'));
}

void, затем catchError

void copyToClipboard(BuildContext context, String text) {
  Clipboard.setData(ClipboardData(text: text))
      .then((_) => showSnackBar(context, 'Copied to clipboard'))
      .catchError((Object error) => showSnackBar(context, 'Error $error'));
}

Все методы работают. Если я использую then и catchError, нужно ли мне обернуть код в функцию async?

Какой рекомендуемый способ?

1 Ответ

2 голосов
/ 07 марта 2020

Во-первых, понятия 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 в сигнатуру функции, чтобы функции, вызывающие эту функцию, знали, что ее вызов может занять некоторое время и ждать его.

...