Skip to content

Instantly share code, notes, and snippets.

@folaoluwafemi
Last active March 15, 2023 18:45
Show Gist options
  • Save folaoluwafemi/26fb0e3efb2a4ffd6885b1b094893941 to your computer and use it in GitHub Desktop.
Save folaoluwafemi/26fb0e3efb2a4ffd6885b1b094893941 to your computer and use it in GitHub Desktop.
a widget builder for classes that 'is a' ChangeNotifer || useful when not using provider package
import 'package:flutter/material.dart';
typedef ChangeNotifierSelector<T extends ChangeNotifier> = bool Function(
T? previous,
T next,
);
typedef ChangeNotifierBuilderCallback<T extends ChangeNotifier> = Widget
Function(BuildContext context, T value);
class ChangeNotifierBuilder<T extends ChangeNotifier> extends StatefulWidget {
final ChangeNotifierBuilderCallback<T> builder;
final T listenable;
final ChangeNotifierSelector<T>? buildWhen;
const ChangeNotifierBuilder({
Key? key,
required this.listenable,
this.buildWhen,
required this.builder,
}) : super(key: key);
@override
State<ChangeNotifierBuilder<T>> createState() =>
_ChangeNotifierBuilderState<T>();
}
class _ChangeNotifierBuilderState<T extends ChangeNotifier>
extends State<ChangeNotifierBuilder<T>> {
T? listenable;
void changeListener() {
final bool? shouldSetState = widget.buildWhen?.call(
listenable,
widget.listenable,
);
if (shouldSetState ?? true) {
setState(() {});
}
listenable = widget.listenable;
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
widget.listenable.addListener(changeListener);
}
@override
void didUpdateWidget(ChangeNotifierBuilder<T> oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.listenable != widget.listenable) {
oldWidget.listenable.removeListener(changeListener);
listenable = widget.listenable;
widget.listenable.addListener(changeListener);
}
}
@override
void dispose() {
widget.listenable.removeListener(changeListener);
super.dispose();
}
@override
Widget build(BuildContext context) {
return widget.builder.call(context, widget.listenable);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment