import 'package:flutter/widgets.dart'; import 'bloc_base.dart'; Type _typeOf<T>() => T; class BlocProvider<T extends BlocBase> extends StatefulWidget { BlocProvider({ Key key, @required this.child, @required this.blocs, }) : super(key: key); final Widget child; final List<T> blocs; @override _BlocProviderState<T> createState() => _BlocProviderState<T>(); static List<T> of<T extends BlocBase>(BuildContext context) { final type = _typeOf<_BlocProviderInherited<T>>(); _BlocProviderInherited<T> provider = context.ancestorInheritedElementForWidgetOfExactType(type)?.widget; return provider?.blocs; } } class _BlocProviderState<T extends BlocBase> extends State<BlocProvider<T>> { @override void dispose() { widget.blocs.map((bloc) { bloc.dispose(); }); super.dispose(); } @override Widget build(BuildContext context) { return _BlocProviderInherited<T>( blocs: widget.blocs, child: widget.child, ); } } class _BlocProviderInherited<T> extends InheritedWidget { _BlocProviderInherited({ Key key, @required Widget child, @required this.blocs, }) : super(key: key, child: child); final List<T> blocs; @override bool updateShouldNotify(_BlocProviderInherited oldWidget) => false; }