какая разница между
void test1(void fun(String element)) {
fun("Test1");
}
//AND
void test2(Function(String element) fun) {
fun("Test2");
}
Я попытался запустить их оба и не нашел отличий в выводе:
void main() {
test1((test) => print(test));
test2((test) => print(test));
}
void test1(void fun(String element)) {
fun("Test1");
}
void test2(Function(String element) fun) {
fun("Test2");
}
// Output:
// Test1
// Test2
Я новичок в Dart. Я всегда использую Java, поэтому передача функции функции для меня в новинку, поэтому, если кто-нибудь может объяснить мне, в чем различия в приведенном выше коде, был бы очень благодарен.

Нет реальной разницы между объявлением параметра функции с типом функции, предшествующим имени (void Function(String) fun), или как (C-подобный) синтаксис, подобный функции, где имя находится посередине (void fun(String element)). Оба объявляют аргумент с именем fun с типом void Function(String).
Изначально у Dart не было способа написать тип функции в строке, вам нужно было использовать typedef, поэтому в большинстве старых кодов используется нотация void fun(String element). Когда была введена нотация returnType Function(arguments) (поскольку она была необходима для определения универсальных типов функций), стало проще записывать типизированные параметры функции с указанием типа в первую очередь.
Используются оба, ни один из них не является идиоматическим, используйте то, что, по вашему мнению, лучше всего читается.
Есть одно различие между двумя форматами, о котором стоит помнить:
void fun(String element) требует имен для аргументов функции. Если вы пишете void fun(String), это интерпретируется как функция, принимающая один аргумент типа dynamic с именем String.void Function(String) fun предполагает, что типом является имя единственного аргумента.Я лично предпочитаю исходный формат параметров функции, за исключением того, что нужно писать имена аргументов.