Skip to content

Instantly share code, notes, and snippets.

@boeledi
Last active March 27, 2023 13:39
Show Gist options
  • Save boeledi/cb9b933b2e2664ae1ee5cc78b0da273a to your computer and use it in GitHub Desktop.
Save boeledi/cb9b933b2e2664ae1ee5cc78b0da273a to your computer and use it in GitHub Desktop.
import 'package:flutter/material.dart';
typedef BlocBuilder<T> = T Function();
typedef BlocDisposer<T> = Function(T);
abstract class BlocBase {
void dispose();
}
class BlocProvider<T extends BlocBase> extends StatefulWidget {
const BlocProvider({
super.key,
required this.child,
required this.blocBuilder,
this.blocDispose,
});
final Widget child;
final BlocBuilder<T> blocBuilder;
final BlocDisposer<T>? blocDispose;
@override
_BlocProviderState<T> createState() => _BlocProviderState<T>();
static T? of<T extends BlocBase>(BuildContext context) {
final InheritedElement? inheritedElement = context.getElementForInheritedWidgetOfExactType<_BlocProviderInherited<T>>();
if (inheritedElement == null) {
return null;
}
final _BlocProviderInherited<T>? provider = inheritedElement.widget as _BlocProviderInherited<T>?;
return provider?.bloc;
}
}
class _BlocProviderState<T extends BlocBase> extends State<BlocProvider<T>> {
late T bloc;
@override
void initState() {
super.initState();
bloc = widget.blocBuilder();
}
@override
void dispose() {
if (widget.blocDispose != null) {
widget.blocDispose?.call(bloc);
} else {
bloc.dispose();
}
super.dispose();
}
@override
Widget build(BuildContext context) {
return _BlocProviderInherited<T>(
bloc: bloc,
child: widget.child,
);
}
}
class _BlocProviderInherited<T extends BlocBase> extends InheritedWidget {
const _BlocProviderInherited({
Key? key,
required Widget child,
required this.bloc,
}) : super(key: key, child: child);
final T bloc;
@override
bool updateShouldNotify(_BlocProviderInherited<T> oldWidget) => false;
}
@lifetin
Copy link

lifetin commented Apr 1, 2019

flutter/flutter#30325
我遇到一个问题

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment