nexo 0.0.8-beta.0
nexo: ^0.0.8-beta.0 copied to clipboard
Reusable architecture, error handling, and logging utilities for Flutter apps.
Changelog #
0.0.8-beta.0 #
nexo_core — BLoC/Cubit адаптация под Result #
-
executeMutation<T>()— теперь принимаетFuture<Result<T>>вместо throw:await executeMutation( emit: emit, action: () => _repository.create(_token, payload), // Result<Film> onSuccess: (film) { ... }, onError: (f) { ... }, ); -
loadData<T>()— теперь принимаетFuture<Result<T>>:await loadData<User>( emit: emit, action: () => _getUserUseCase(id), // Result<User> toState: (data) => State.ready(data: data), toError: (f) => State.error(failure: f), ); -
NexoCrudState<T, F>— generic feedback вместоString?:typedef FilmCrudState = NexoCrudState<FilmDto, AdminFeedback>; -
NexoAdminCrudBloc<T, F>— наследуетNexoBloc, generic feedback:class AdminFilmsBloc extends NexoAdminCrudBloc<FilmDto, AdminFeedback> { @override AdminFeedback buildSuccessFeedback(String msg) => AdminFeedback.success(msg); @override AdminFeedback buildErrorFeedback(String msg) => AdminFeedback.error(msg); } -
NexoPaginatedMixin— убрано ограничениеon Bloc<Object, Object>, работает с любымNexoBloc<Event, State>.
Codegen #
- Настроен
build_runnerдля@NexoUseCaseAnnotation. - Добавлена dev-зависимость
source_gen: ^4.2.4.
0.0.7-beta.0 #
nexo_core — BLoC/Cubit улучшения #
-
executeMutation()— обёртка для мутаций (create/update/delete) вNexoBlocиNexoCubit:await executeMutation( emit: emit, action: () => _repository.create(_token, payload), onSuccess: () { _emitReady(emit, feedback: 'Создано'); }, onError: (f) { _emitReady(emit, feedback: f.userMessage); }, ); -
loadData<T>()— упрощённая загрузка данных вNexoBlocиNexoCubit:await loadData<User>( emit: emit, action: () => _getUserUseCase(id), toState: (data) => State.ready(data: data), toError: (f) => State.error(failure: f), onLoading: () => const State.loading(), );
nexo_errors — Result convenience methods #
orElse(fn)— значение при успехе, иначе дефолт.tap(onSuccess:, onFailure:)— side-effect без трансформации.mapFailure(fn)— трансформация только Failure.flatMap(fn)— chaining: если success — применяет fn.when(success:, onFailure:)— паттерн-матчинг без fold.
nexo_core — NexoValidators расширение #
hasUpperAndDigit()— проверка заглавной буквы и цифры.hasSpecialChar()— проверка спецсимвола.matches(pattern)— проверка по regex.matchesField(other)— зависимая валидация (совпадение полей).
nexo_testing — новые матчеры #
isRight()/isLeft()— алиасы дляisSuccess/isFailure.hasFailureCode()/hasFailureMessage()/hasFailureType()— матчеры для Failure.resultContains()— проверка значения в Result.
0.0.6-beta.0 #
nexo_core — новые абстракции #
-
NexoAdminCrudBloc<T>— generic CRUD BLoC для админ-панелей:- Интерфейс
NexoAdminRepository<T>с методамиlist,create,delete. - Автоматические обработчики:
LoadCrudData,SearchCrudData,CreateCrudEntity,DeleteCrudEntity. executeMutation()— обёртка над try/catch для мутаций с чтением текущего state.NexoCrudState<T>— sealed-состояние:NexoCrudLoading,NexoCrudReady,NexoCrudError.
- Интерфейс
-
NexoPaginatedMixin<T, Cursor>— миксин для cursor-based пагинации:- Инкапсулирует
PaginationController, предоставляетloadMore(emit, loader, onReady). - Автоматический emit loading/ready/error, guard от параллельных загрузок.
- Convenience-геттеры:
paginatedItems,nextCursor,hasMore,isPaginatedLoading.
- Инкапсулирует
-
@NexoUseCaseAnnotation— аннотация для codegen UseCase (генератор в отдельном пакетеnexo_generator).
nexo_errors — FailureMapper 2.0 #
-
FailureMapper2— расширяемый маппер ошибок с поддержкой DI:register(mapper)/registerAll(mappers)— регистрация кастомных мапперов.- Кастомные мапперы имеют приоритет над встроенными.
fromStatic()для обратной совместимости.FailureMapperпомечен@Deprecated('Используйте FailureMapper2').
-
DomainExceptionFailureMapper— добавлен параметрextraMappings:Map<Type, Failure Function(Object)>— кастомные маппинги для исключений приложения.- Позволяет расширять маппер без модификации исходного кода nexo.
-
Улучшены Hive/Isar/Drift мапперы — заменён текстовый хевристик на stackTrace:
HiveFailureMapper: проверкаtraceStr.contains('package:hive')вместоruntimeType.IsarFailureMapper: проверкаtraceStr.contains('package:isar').DriftFailureMapper: проверкаtraceStr.contains('package:drift').
nexo_cli — новые флаги #
--admin-crud— генерирует фичу сNexoAdminCrudBloc(implies--bloc).--usecase-gen— генерирует@NexoUseCaseAnnotationabstract class.--paginated— генерирует BLoC сNexoPaginatedMixin.
Зависимости #
- Добавлена dev-зависимость
source_gen: ^4.2.4для codegen.
0.0.5-beta.0 #
- Breaking:
Result<T>— собственный sealed-тип вместоEither<Failure, T>из dartz:- те же короткие имена веток
Right<T>/Left<T>; фабрики-алиасыResult.success(value)/Result.failure(failure); - именованный
fold(onFailure:, onSuccess:)— порядок веток больше нельзя перепутать; - хелперы
isSuccess/isFailure,dataOrNull/failureOrNull,map,getOrElse; - исчерпывающий паттерн-матчинг по sealed-классу (
switch (result) { case Right(:final value) ... }); - value-equality у обеих веток (удобно в тестах:
expect(result, const Right(42))); - зависимость
dartzудалена, её типы (Either,Left,Rightиз dartz) больше не экспортируются. - Миграция: позиционный
fold((l), (r))→fold(onFailure:, onSuccess:); остальной код наRight/Leftсовместим.
- те же короткие имена веток
- Новый модуль
nexo_testing(lib/nexo_testing.dart) — матчеры для тестов на базе пакетаmatcher:isSuccess([value])/isFailure(code:)дляResult;failureWithCode(code)/failureWithUserMessage(text)дляFailure;- расширения
dataOrThrow()/failureOrThrow().
nexo_ui: новые виджетыNexoAsyncStateBuilder(маппингNexoAsyncStateна UI с дефолтами idle/loading/failure) иNexoFailureView(иконка +userMessage+ опциональный технический код + кнопка «Повторить»).nexo_core: новыйNexoAsyncCubit<T>— готовый кубит типового экрана: реализуйтеfetch(), вызывайтеload()/retry()/refresh()(тихое обновление без спиннера), состояние —NexoAsyncState; встроенная защита от устаревших ответов и колбэкonFailure.nexo_ui:showFailureSnackBar/showFailureDialog(тексты изFailurePresenter, опциональный retry),NexoEmptyView(заглушка пустого состояния с действием) иNexoSkeletonLoader/NexoSkeletonList(пульсирующие заглушки загрузки).nexo_errors: requestId в ошибках —DioFailureMapperтеперь прокидываетx-request-id(ключnexoRequestIdExtraKeyизextra) в поляrequestIdуNetworkAppFailure/HttpAppFailure, чтобы связывать ошибки UI с логами и сервером;NexoRequestIdInterceptor.extraRequestIdKeyиспользует тот же общий ключ.nexo_core: безопасность логов —NexoLoggingInterceptorмаскирует чувствительные query-параметры URL (/items?access_token=…) во всех фазах (запрос / ответ / ошибка); раньше токен мог попасть в лог открытым.nexo_core: новыйNexoOutbox— очередь офлайн-мутаций (паттерн outbox):enqueue()мгновенно кладёт действие в очередь (для UI это уже «успех»),flush()последовательно доставляет операции строго в порядке постановки и останавливается на первой ошибке, возвращая маппнутыйFailure(OutboxFlushResult). Хранилище подключается через интерфейсOutboxStore(готоваяInMemoryOutboxStore; для продакшена — реализация поверх Hive / Isar / Drift через готовые датасорсы пакета). ПолеOutboxEntry.idпредназначено для ключа идемпотентности на сервере.nexo_core: новыеNexoValidators— готовые валидаторы форм (requiredField,email,phone,url,number,minLength/maxLength,password, композиторcompose). ТипNexoValidator<T> = String? Function(T?)совместим сFormFieldValidator— подходит напрямую вTextFormField.validator;nullсчитается пустым значением. Тексты ошибок берутся из каталога сообщений пакета (включая подстановку имени поля черезfieldName:) и локализуются вместе с ним; каждое правило принимаетmessage:для полного переопределения текста.example: демо-галерея из четырёх вкладок — асинхронный экран (NexoAsyncCubit+NexoAsyncStateBuilder+ skeleton/empty/failure), форма наNexoValidators, feedback-виджеты (showFailureSnackBar/showFailureDialog, локализация, заглушки) и живая очередьNexoOutboxс офлайн-переключателем.nexo_errors: breadcrumbs — лента последних событий перед сбоем: новая модельNexoBreadcrumb(категория, уровень, данные, timestamp) и методrecordBreadcrumbвNexoCrashReporter;CollectingNexoCrashReporterдержит кольцевой буфер (maxBreadcrumbs, по умолчанию 50) и отдаёт снимок черезbreadcrumbTrail;NexoBlocObserverпишет ошибки блоков в ленту автоматически. Breaking для своих реализацийNexoCrashReporter: добавьте пустойrecordBreadcrumb.- Обновлены зависимости:
flutter_secure_storage^9.2.4→^11.0.0(без изменений в API датасорса), dev-зависимостьfreezed^3.2.5→^4.0.0с регенерациейfailure.freezed.dart; остальные пакеты — минорные апгрейды. - Новый модуль
nexo_ui(ранее WIP за.gitignore, теперь часть публичного API):gap.dart: расширенияnum.gapH/num.gapW— спейсеры дляColumn/Rowс масштабированием через ScreenUtil (требует инициализацииScreenUtilInit);widget_wrappers.dart: цепочки обёрток виджетов —pad/padSymmetric/padOnly,center,align,expanded,flexible,sized,aspectRatio,opacity,safeArea,clipRRect,decorated,onTap;text_wrapper.dart:'строка'.text(...)— быстрое созданиеText;- компоненты
NexoButton(варианты filled/outlined/text, состояние загрузки, иконка) иNexoCard(рамка, тень, нажатие);
- Баррел
lib/nexo_ui.dart; модуль также экспортируется из зонтичногоpackage:nexo/nexo.dart.
0.0.4-beta.4 #
- Web-совместимость
nexo_errors: мапперы больше не импортируютdart:ioнапрямую. Новые probe-хелперы (platform_exceptions.dart) через conditional imports определяютSocketException/HandshakeException/TlsException/HttpException/FileSystemExceptionна VM и возвращают «не совпадает» на вебе, где эти типы недоступны. DioFailureMapper: добавлен кейсDioExceptionType.transformTimeout(появился в dio 5.10; dart2js требует исчерпывающий switch по enum — без кейса веб-сборка падала).- Констрейнт dio поднят до
^5.10.0.
0.0.4-beta.3 #
- Metadata refresh and republish for current stable Flutter/Dart compatibility.
- Includes recent core, error handling, and CLI generator improvements.
0.0.4-beta.2 #
- Документация и примеры:
WidgetsFlutterBinding.ensureInitializedиrunAppдолжны вызываться внутри телаrunAppInZone, иначе Flutter сообщает о zone mismatch.
0.0.4-beta.1 #
- Добавлен
NexoFlutterErrors: глобальныеFlutterError.onError,PlatformDispatcher.instance.onError, опционально зона черезrunAppInZone; интеграция сNexoLoggerиNexoCrashReporter(без UI). NexoBlocObserver: опциональныйcrashReporterдля дублирования ошибок BLoC в отчётность.- Добавлен
CollectingNexoCrashReporterдля тестов.
0.0.3-beta.1 #
- Предыдущая публичная версия.