Created
July 12, 2024 17:32
-
-
Save jezell/5b2dc8919ef87af622432c0c2fa17cc4 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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