Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Правила именования констант в Dart
В Dart есть чёткие соглашения по именованию констант. Давайте разберёмся, какие это правила и как их применять.
Основное правило: lowerCamelCase
Константы в Dart именуются в lowerCamelCase, а не UPPER_SNAKE_CASE как в Java или C++.
// ✅ Правильно
const maxRetries = 3;
const defaultTimeout = Duration(seconds: 30);
const appVersion = '1.0.0';
const apiBaseUrl = 'https://api.example.com';
// ❌ Неправильно
const MAX_RETRIES = 3; // Java style
const max_retries = 3; // Python style
const MaxRetries = 3; // PascalCase (для классов)
Правила по типам констант
1. Простые const значения (top-level)
// ✅ Правильно
const String appName = 'MyApp';
const int maxConnections = 10;
const double minVersion = 1.5;
const bool isProduction = true;
2. Константы в классах
// ✅ Правильно
class Config {
static const String appName = 'MyApp';
static const int maxRetries = 3;
static const Duration timeout = Duration(seconds: 30);
}
class Colors {
static const Color primary = Color(0xFF2196F3);
static const Color secondary = Color(0xFFFFC107);
}
3. Константные коллекции
// ✅ Правильно
const List<String> supportedLanguages = ['en', 'ru', 'de'];
const Map<String, String> errorMessages = {
'not_found': 'Resource not found',
'forbidden': 'Access denied',
'server_error': 'Internal server error',
};
Const vs Final
const — значение известно во время компиляции
const int maxItems = 100; // Компилируется, значение известно
const DateTime now = DateTime(2025, 3, 26); // Можно const
final — значение известно во время выполнения
final String apiKey = Platform.environment['API_KEY'] ?? 'default';
final int randomNumber = Random().nextInt(100);
// ✅ Правильно
const String appVersion = '1.0.0'; // Const — значение известно
final String deviceId = getDeviceId(); // Final — runtime value
// ❌ Неправильно
const String deviceId = getDeviceId(); // Ошибка! deviceId неизвестен во время компиляции
Константы для разных целей
API URLs и endpoints
// ✅ Правильно
const String apiBaseUrl = 'https://api.example.com';
const String apiUsersEndpoint = '/users';
const String apiPostsEndpoint = '/posts';
// Или в классе
class ApiEndpoints {
static const String base = 'https://api.example.com';
static const String users = '$base/users';
static const String posts = '$base/posts';
static const String comments = '$base/comments';
}
Таймауты и задержки
// ✅ Правильно
const Duration defaultTimeout = Duration(seconds: 30);
const Duration debounceDelay = Duration(milliseconds: 500);
const Duration animationDuration = Duration(milliseconds: 300);
Регулярные выражения
// ✅ Правильно
const String emailRegex = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$';
const String phoneRegex = r'^\+?[0-9]{10,}$';
const String urlRegex = r'^https?://[^\s/$.?#].[^\s]*$';
Размеры и отступы (UI)
// ✅ Правильно
const double defaultPadding = 16.0;
const double defaultBorderRadius = 12.0;
const EdgeInsets defaultScreenPadding = EdgeInsets.all(16.0);
const int maxItemsPerPage = 20;
const double minSwipeDistance = 50.0;
Сообщения об ошибках
// ✅ Правильно
const String errorNetworkConnection = 'No internet connection';
const String errorUserNotFound = 'User not found';
const String errorInvalidEmail = 'Invalid email address';
// Или в классе
class ErrorMessages {
static const String networkError = 'No internet connection';
static const String serverError = 'Server error. Please try again.';
static const String validationError = 'Invalid input';
}
Организация констант
Вариант 1: Отдельный файл
// lib/constants/app_constants.dart
const String appName = 'MyApp';
const String appVersion = '1.0.0';
const String apiBaseUrl = 'https://api.example.com';
// lib/constants/ui_constants.dart
const double defaultPadding = 16.0;
const double defaultBorderRadius = 12.0;
// lib/constants/error_messages.dart
const String errorNetworkConnection = 'No internet connection';
const String errorUserNotFound = 'User not found';
Вариант 2: Класс с константами
class AppConstants {
static const String appName = 'MyApp';
static const String appVersion = '1.0.0';
}
class ApiConstants {
static const String baseUrl = 'https://api.example.com';
static const Duration timeout = Duration(seconds: 30);
}
class UiConstants {
static const double defaultPadding = 16.0;
static const double defaultBorderRadius = 12.0;
}
Вариант 3: Enum для связанных констант
// ✅ Правильно — для enum также lowerCamelCase
enum Environment {
development,
staging,
production,
}
enum UserRole {
admin,
moderator,
user,
}
const Map<Environment, String> environmentUrls = {
Environment.development: 'http://localhost:3000',
Environment.staging: 'https://staging.example.com',
Environment.production: 'https://api.example.com',
};
Специальные случаи
Compile-time constants (const constructor)
// ✅ Правильно
const TextStyle headingStyle = TextStyle(
fontSize: 24.0,
fontWeight: FontWeight.bold,
);
const EdgeInsets buttonPadding = EdgeInsets.symmetric(
horizontal: 16.0,
vertical: 8.0,
);
Приватные константы (по Dart conventions)
// ✅ Правильно
const String _apiKey = 'secret-key'; // Приватная константа тоже lowerCamelCase
const int _maxRetries = 3;
class MyService {
static const String _internalUrl = 'http://internal.service';
}
Lint rules
В analysis_options.yaml есть правило для проверки:
linter:
rules:
- constant_identifier_names
Этот lint запрещает UPPER_SNAKE_CASE для констант и требует lowerCamelCase.
Итоговая таблица
| Что | Правильно | Неправильно |
|---|---|---|
| const переменная | const appVersion = '1.0.0' | const APP_VERSION = '1.0.0' |
| static const | static const int maxItems = 10 | static const int MAX_ITEMS = 10 |
| Enum значения | enum Role { admin, user } | enum Role { ADMIN, USER } |
| Приватная const | const String _apiKey = 'key' | const String _API_KEY = 'key' |
| Класс с константами | class Config { static const ... } | class CONFIG { ... } |
Практический пример проекта
// lib/constants/constants.dart
class AppConstants {
static const String appName = 'FlutterApp';
static const String appVersion = '1.0.0';
}
class ApiConstants {
static const String baseUrl = 'https://api.example.com';
static const Duration requestTimeout = Duration(seconds: 30);
static const int maxRetries = 3;
}
class UiConstants {
static const double defaultPadding = 16.0;
static const double buttonHeight = 48.0;
static const Duration animationDuration = Duration(milliseconds: 300);
}
class ErrorMessages {
static const String networkError = 'Network error';
static const String validationError = 'Invalid input';
}
Главное правило
В Dart — всегда lowerCamelCase для констант, независимо от их типа или значения.