Trong Dart/Flutter, có sự phân biệt rõ ràng giữa các tham số bắt buộc và tùy chọn. Hãy phân tích chi tiết:

  1. Tham số bắt buộc (Required Parameters):
// Tham số bắt buộc thông thường
void example1(String name, int age) {
  print('Name: $name, Age: $age');
}

// Tham số bắt buộc với từ khóa required trong named parameters
void example2({
  required String name,
  required int age,
}) {
  print('Name: $name, Age: $age');
}
  • Phải được cung cấp khi gọi hàm
  • Không thể bỏ qua hoặc để trống
  • Nếu không truyền sẽ gây lỗi biên dịch
  1. Tham số tùy chọn (Optional Parameters):

a) Optional Positional Parameters:

void example3(String name, [int? age, String? address]) {
  print('Name: $name, Age: $age, Address: $address');
}
  • Đặt trong dấu []
  • Có thể bỏ qua khi gọi hàm
  • Thường được khai báo nullable (với ?)

b) Optional Named Parameters:

void example4({String? name, int? age}) {
  print('Name: $name, Age: $age');
}
  • Đặt trong dấu {}
  • Có thể bỏ qua khi gọi hàm
  • Thường được khai báo nullable hoặc có giá trị mặc định
  1. Tham số có giá trị mặc định:
void example5({
  String name = 'Anonymous',
  int age = 0,
}) {
  print('Name: $name, Age: $age');
}
  • Được gán giá trị mặc định
  • Nếu không truyền giá trị, sẽ dùng giá trị mặc định
  • Có thể áp dụng cho cả named và positional parameters
  1. Cách sử dụng:
void main() {
  // Gọi hàm với tham số bắt buộc
  example1('John', 25);

  // Gọi hàm với named required parameters
  example2(name: 'John', age: 25);

  // Gọi hàm với optional positional parameters
  example3('John');  // Chỉ truyền tham số bắt buộc
  example3('John', 25);  // Truyền thêm age
  example3('John', 25, 'New York');  // Truyền đầy đủ

  // Gọi hàm với optional named parameters
  example4();  // Không truyền tham số nào
  example4(name: 'John');  // Chỉ truyền name
  example4(name: 'John', age: 25);  // Truyền đầy đủ

  // Gọi hàm với default parameters
  example5();  // Sử dụng giá trị mặc định
  example5(name: 'John');  // Ghi đè giá trị mặc định của name
}
  1. Một số quy tắc và best practices:
  • Tham số bắt buộc nên đặt trước tham số tùy chọn
  • Không nên trộn lẫn optional positional và optional named parameters
  • Sử dụng named parameters khi có nhiều tham số để code dễ đọc hơn
  • Nên cung cấp giá trị mặc định cho tham số tùy chọn nếu có thể
  • Sử dụng required keyword khi muốn đảm bảo tham số named phải được cung cấp

Trong Widget Flutter:

class CustomWidget extends StatelessWidget {
  // Required parameters
  final String title;

  // Optional parameters
  final Color? backgroundColor;
  final double fontSize;

  const CustomWidget({
    required this.title,  // Bắt buộc
    this.backgroundColor,  // Tùy chọn
    this.fontSize = 14.0,  // Tùy chọn với giá trị mặc định
  });

  @override
  Widget build(BuildContext context) {
    return Container(
      color: backgroundColor,
      child: Text(
        title,
        style: TextStyle(fontSize: fontSize),
      ),
    );
  }
}

Việc phân biệt và sử dụng đúng loại tham số sẽ giúp code trở nên:

  • An toàn hơn về mặt kiểu dữ liệu
  • Dễ đọc và bảo trì
  • Linh hoạt trong việc sử dụng
  • Tránh được các lỗi runtime