From acc44bdcc3177e551e33eb1da1d59f0723aa5358 Mon Sep 17 00:00:00 2001 From: fluttermiddlepodcast Date: Wed, 4 Feb 2026 10:00:25 +0300 Subject: [PATCH 1/2] added measureTime transformer for UsersBloc --- lib/core/bloc/transformers/measure_time.dart | 43 ++++++++++++++++++++ lib/features/users/bloc/users_bloc.dart | 8 +++- 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 lib/core/bloc/transformers/measure_time.dart diff --git a/lib/core/bloc/transformers/measure_time.dart b/lib/core/bloc/transformers/measure_time.dart new file mode 100644 index 0000000..5d37f5f --- /dev/null +++ b/lib/core/bloc/transformers/measure_time.dart @@ -0,0 +1,43 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +/// Example: +/// +/// on( +/// _onEvent, +/// transformer: measureTime( +/// blocName: 'MyBloc', +/// ), +/// ); +/// +EventTransformer measureTime({ + String? blocName, +}) { + return (events, mapper) { + return events.asyncExpand( + (event) { + final stopwatch = Stopwatch()..start(); + final eventName = event.toString(); + final blocPrefix = blocName != null ? '[$blocName]' : ''; + + debugPrint('$blocPrefix ⏱️ Event STARTED: $eventName'); + + final controller = StreamController(); + + mapper(event).listen( + controller.add, + onError: controller.addError, + onDone: () { + stopwatch.stop(); + debugPrint('$blocPrefix ⏱️ $eventName: ${stopwatch.elapsedMilliseconds} ms'); + controller.close(); + }, + ); + + return controller.stream; + }, + ); + }; +} diff --git a/lib/features/users/bloc/users_bloc.dart b/lib/features/users/bloc/users_bloc.dart index 4b013f0..4f2f4c6 100644 --- a/lib/features/users/bloc/users_bloc.dart +++ b/lib/features/users/bloc/users_bloc.dart @@ -1,4 +1,5 @@ import 'package:bloc_concurrency/bloc_concurrency.dart'; +import 'package:bloc_example/core/bloc/transformers/measure_time.dart'; import 'package:bloc_example/features/users/bloc/users_bloc_event.dart'; import 'package:bloc_example/features/users/bloc/users_bloc_state.dart'; import 'package:bloc_example/features/users/model/user.dart'; @@ -9,7 +10,12 @@ class UsersBloc extends HydratedBloc { final UsersRepository usersRepository; UsersBloc({required this.usersRepository}) : super(UsersBlocStateLoading()) { - on(_onFetch); + on( + _onFetch, + transformer: measureTime( + blocName: 'UsersBloc', + ), + ); on( _onFetchMore, transformer: droppable(), From 188e4895d6268613e8f9de6bd78b2f1019dd2785 Mon Sep 17 00:00:00 2001 From: fluttermiddlepodcast Date: Wed, 4 Feb 2026 10:07:23 +0300 Subject: [PATCH 2/2] updated analyzer rules --- analysis_options.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/analysis_options.yaml b/analysis_options.yaml index 057fde6..c49ba37 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -2,6 +2,8 @@ include: package:flutter_lints/flutter.yaml linter: rules: + unintended_html_in_doc_comment: false + formatter: trailing_commas: preserve