Передача типизированной функции в качестве параметра в Dart

Я знаю функции класс может быть передан в качестве параметра другой функции, например:

void doSomething(Function f) {
    f(123);
}

но есть ли способ ограничить Аргументы и возвращаемый тип параметра функции?

например, в данном случае f вызывается непосредственно на целое число, но что, если это функция, принимающая другой тип?

Я попытался передать его как Function<Integer>, но функция не является параметрический тип.

Is есть ли другой способ указать сигнатуру передаваемой функции в качестве параметра?

4 ответов


Edit: обратите внимание, что этот ответ содержит устаревшую информацию. См.ответ Irn для получения более актуальной информации.

чтобы расширить ответ Рэндала, ваш код может выглядеть примерно так:

typedef void IntegerArgument(int x);

void doSomething(IntegerArgument f) {
    f(123);
}

Function<int> Кажется, что это была бы хорошая идея, но проблема в том, что мы можем захотеть указать тип возврата, а также тип произвольного числа аргументов.


Дротик v1.23 добавлен новый синтаксис для написания типов функций, который также работает в строке.

void doSomething(Function(int) f) {
  f(123);
}

Он имеет преимущество перед синтаксисом function-parameter, что вы также можете использовать его для переменных или где угодно еще вы хотите написать тип.

void doSomething(Function(int) f) {
  Function(int) g = f;
  g(123);
}

var x = new List<int Function(int)>[];

вы можете иметь типизированный параметр функции или использовать typedef

void main() {
  doSomething(xToString);
  doSomething2(xToString);
}

String xToString(int s) => 's';

typedef String XToStringFn(int s);

void doSomething(String f(int s)) {
    print('value: ${f(123)}');
}

void doSomething2(XToStringFn f) {
    print('value: ${f(123)}');
}

пример DartPad