Sự khác nhau giữa Function() và Function trong Dart?
Sự khác nhau giữa hai cách khai báo Function() và Function trong ngôn ngữ lập trình Dart
Khi khai báo một hàm function
(thường gặp nhất là khi khai báo hàm của một class
) trong Dart, chúng ta thường gặp hai cách khai báo sau:
Function first;
Function() second;
Đâu là sự khác nhau giữa Function()
và Function
trong Dart?
Function
biểu diễn cho bất kì hàmfunction
nào. Chẳng hạn chúng ta có hai hàmfoo
vàbar
như sau:
void foo() {}
int bar(int positional, {String? named}) => positional;
Và một biến example
có kiểu là Function
. Bây giờ, chúng ta thử gán các biến cho các hàm này
void main() {
void foo() {}
int bar(int positional, {String? named}) => positional;
Function example = foo; // OK
example = bar; // OK
}
Function()
biểu diễn một hàmfunction
không có tham số. Vẫn với hai hàmfoo
vàbar
như trên, chúng ta thử gán cho biếnexample
có kiểu làFunction()
.
void main() {
void foo() {}
int bar(int positional, {String? named}) => positional;
Function() example = foo; // OK
example = bar; // Err
}
Khi khai báo các hàm và gán giá trị cho biến hàm, chúng ta cần chú ý chúng phải có sự tương thích về tham số.
void main() {
void foo() {}
int bar(int a) {
return a;
};
int Function(int) example;
int Function(String) anotherExample;
example = foo; // Erros, foo không có tham số trong khi example có tham số
example = bar; // OK
anotherExample = bar; //Err
}
Một ví dụ khác về Function()
và Function
trong Dart
Chúng ta có phương thức callMe()
không có tham số, được gọi bởi một nút bấm ElevatedButton
void callMe() {
print('OK');
}
ElevatedButton
có mã nguồn như sau:
ElevatedButton(
onPressed: callMe, // its working even if we called another method from here
child: Text('Pressed Me'),
),
Nếu hàm callMe()
có tham số
void callMe(int a) {
print('$a');
}
thì nó sẽ không thể callback theo cách trên, mà phải sử dụng cách sau:
RaisedButton(
onPressed: () {
callMe(3);
},
child: Text('Pressed Me'),
),
Để thảo luận về các vấn đề trong bài viết này, mời các bạn tham gia nhóm facebook https://fb.com/groups/divindev/