Skip to content

Instantly share code, notes, and snippets.

@stevenosse
Created January 17, 2025 18:21
Show Gist options
  • Save stevenosse/4ca759d607366fade01fed6f559ee2d7 to your computer and use it in GitHub Desktop.
Save stevenosse/4ca759d607366fade01fed6f559ee2d7 to your computer and use it in GitHub Desktop.
Like BlocConsumer but for Value/ChangeNotifiers
import 'package:flutter/material.dart';
class ListenableConsumer<T extends Listenable> extends StatefulWidget {
final T listenable;
final Widget Function(BuildContext context, T value) builder;
final void Function(BuildContext context, T value) listener;
const ListenableConsumer({
super.key,
required this.listenable,
required this.builder,
required this.listener,
});
@override
State<ListenableConsumer<T>> createState() => _ListenableConsumerState<T>();
}
class _ListenableConsumerState<T extends Listenable> extends State<ListenableConsumer<T>> {
late T _value;
@override
void initState() {
super.initState();
_value = widget.listenable;
_value.addListener(_valueChanged);
}
@override
void didUpdateWidget(ListenableConsumer<T> oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.listenable != widget.listenable) {
oldWidget.listenable.removeListener(_valueChanged);
_value = widget.listenable;
_value.addListener(_valueChanged);
}
}
@override
void dispose() {
_value.removeListener(_valueChanged);
super.dispose();
}
void _valueChanged() {
setState(() => widget.listener(context, _value));
}
@override
Widget build(BuildContext context) {
return widget.builder(context, _value);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment