/// /// Сервис со вспомогательными функциями /// class Utils { /// /// Склонение числительных /// /// [number] Число, по которому будем склонять [int] /// [titles] Возможные наборы данных. Должно быть 3 варианта [List] /// /// Пример: /// /// ```dart /// print(HelperService.declOfNum(1, ['секунда', 'секунды', 'секунд'])); // секунда /// print(HelperService.declOfNum(2, ['секунда', 'секунды', 'секунд'])); // секунды /// print(HelperService.declOfNum(5, ['секунда', 'секунды', 'секунд'])); // секунд /// ``` /// static T declOfNum(int number, List titles) { List cases = [2, 0, 1, 1, 1, 2]; return titles[(number % 100 > 4 && number % 100 < 20) ? 2 : cases[(number % 10 < 5) ? number % 10 : 5]]; } } typedef ValidatorFunc = String? Function(String? value); class Validators { /// /// Комбинирование нескольких валидаторов /// Исполнение идет в порядке их передачи /// static String? combine(List validators, String? value) { for (ValidatorFunc vfunc in validators) { final String? result = vfunc.call(value); if (result != null) { return result; } } return null; } /// /// Метод валидации данных /// static String? string(String? value) { if (value == null || value.isEmpty) { return 'Значение не может быть пустым'; } if (value.length < 3) { return 'Значение не может быть меньше 3 символов'; } return null; } static String? email(String? email) { if (email == null) return null; if (email.isEmpty) return 'Поле e-mail пустое'; if (!email.contains('@')) return 'Неверный e-mail'; return null; } static String? phone(String? phone) { if (phone == null) return null; if (phone.isEmpty) return 'Введите номер телефона'; if (phone.length != 18) return 'Неверный формат номера'; return null; } }