Skip to content

Instantly share code, notes, and snippets.

@jezell
Created July 12, 2024 17:32
Show Gist options
  • Save jezell/5b2dc8919ef87af622432c0c2fa17cc4 to your computer and use it in GitHub Desktop.
Save jezell/5b2dc8919ef87af622432c0c2fa17cc4 to your computer and use it in GitHub Desktop.
import "package:flutter/material.dart";
abstract class Controller extends ChangeNotifier {
static T ofType<T extends Controller>(BuildContext context) {
return context
.dependOnInheritedWidgetOfExactType<_ControllerModel<T>>()!
.controller;
}
static T? maybeOfType<T extends Controller>(BuildContext context) {
return context
.dependOnInheritedWidgetOfExactType<_ControllerModel<T>>()
?.controller;
}
}
class _ControllerModel<T> extends InheritedWidget {
const _ControllerModel(
{super.key, required super.child, required this.controller});
final T controller;
@override
bool updateShouldNotify(_ControllerModel<T> oldWidget) {
return oldWidget.controller != controller;
}
}
class ControllerBuilder<T extends Controller> extends StatefulWidget {
const ControllerBuilder(
{super.key, required this.controller, required this.builder});
final T controller;
final Widget Function(BuildContext context) builder;
@override
State createState() => _ControllerBuilder<T>();
}
class _ControllerBuilder<T extends Controller>
extends State<ControllerBuilder<T>> {
late T controller = widget.controller;
@override
Widget build(BuildContext context) {
return _ControllerModel<T>(
controller: widget.controller,
child: ListenableBuilder(
listenable: controller,
builder: (context, _) => widget.builder(context)));
}
}
class ControllerProvider<T extends Controller> extends StatelessWidget {
const ControllerProvider(
{super.key, required this.controller, required this.child});
final Widget child;
final T controller;
@override
Widget build(BuildContext context) {
return _ControllerModel<T>(controller: controller, child: this.child);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment