nc-photos/app/lib/bloc_util.dart

60 lines
1.4 KiB
Dart
Raw Normal View History

2024-01-12 19:53:14 +01:00
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
2024-01-12 19:53:14 +01:00
import 'package:provider/single_child_widget.dart';
2023-07-28 18:48:50 +02:00
mixin BlocLogger {
2023-06-18 16:26:19 +02:00
String? get tag => null;
bool Function(dynamic currentState, dynamic nextState)? get shouldLog => null;
}
2023-05-29 18:55:10 +02:00
2024-01-12 19:53:14 +01:00
class BlocListenerT<B extends StateStreamable<S>, S, T>
extends SingleChildStatelessWidget {
const BlocListenerT({
super.key,
required this.selector,
required this.listener,
});
@override
Widget buildWithChild(BuildContext context, Widget? child) {
return BlocListener<B, S>(
listenWhen: (previous, current) =>
selector(previous) != selector(current),
listener: (context, state) => listener(context, selector(state)),
child: child,
);
}
final BlocWidgetSelector<S, T> selector;
final void Function(BuildContext context, T state) listener;
}
2023-05-29 18:55:10 +02:00
/// Wrap around a string such that two strings with the same value will fail
/// the identical check
class StateMessage {
StateMessage(this.value);
final String value;
}
extension EmitterExtension<State> on Emitter<State> {
Future<void> forEachIgnoreError<T>(
Stream<T> stream, {
required State Function(T data) onData,
}) =>
onEach<T>(
stream,
onData: (data) => call(onData(data)),
onError: (_, __) {},
);
}
2024-01-12 19:53:14 +01:00
extension BlocExtension<E, S> on Bloc<E, S> {
void safeAdd(E event) {
if (!isClosed) {
add(event);
}
}
}