Как запросить у пользователя функцию обратного вызова - PullRequest
0 голосов
/ 06 октября 2018

Я хочу попросить пользователя о функции обратного вызова (сокращенно):

Future<dynamic> myfunc(dynamic onSuccess) async {
  Completer c = Completer();

  // some time-consuming procedure

  if (onSuccess is Function) {
    c.complete(true);
    return c.future.then(onSuccess());
  } else {
    c.complete(false);
    return c.future;
  }
}

bool should_be_true = await myfunc(print("Success!"))

Но мой код не работает, dartanalyzer выдает следующую ошибку в последней строке:

error • The expression here has a type of 'void', and therefore cannot be used at example/index.dart:15:35 • use_of_void_result

1 Ответ

0 голосов
/ 06 октября 2018

Некоторые комментарии:

  • Вы передаете результат вызова print, а не функцию.Используйте () => print('...') для передачи в функцию.
  • В функциях, которые возвращают Future, вы хотите вернуть как можно скорее, чтобы не блокировать вашего абонента.Вот почему я использую scehduleMicrotask.В общем, вам не нужно использовать Completer, за исключением очень сложной асинхронной работы.Попробуйте просто использовать async / await.
  • Вам не нужно отмечать функцию с помощью Completer с async.

Попробуйте это:

import 'dart:async';

Future<dynamic> myfunc(dynamic onSuccess) {
  var c = Completer();

  scheduleMicrotask(() {
    // some time-consuming procedure

    if (onSuccess is Function) {
      onSuccess();
      c.complete(true);
    } else {
      c.complete(false);
    }
  });

  return c.future;
}

main() async {
  var should_be_true = await myfunc(() => print("Success!"));
}
...