Complete refactoring SFM App Source Code
This commit is contained in:
72
lib/product/base/bloc/base_bloc.dart
Normal file
72
lib/product/base/bloc/base_bloc.dart
Normal file
@@ -0,0 +1,72 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
typedef BlocBuilder<T> = T Function();
|
||||
typedef BlocDisposer<T> = Function(T);
|
||||
|
||||
abstract class BlocBase {
|
||||
void dispose();
|
||||
}
|
||||
|
||||
class _BlocProviderInherited<T> extends InheritedWidget {
|
||||
const _BlocProviderInherited({
|
||||
Key? key,
|
||||
required Widget child,
|
||||
required this.bloc,
|
||||
}) : super(key: key, child: child);
|
||||
|
||||
final T bloc;
|
||||
|
||||
@override
|
||||
bool updateShouldNotify(_BlocProviderInherited oldWidget) => false;
|
||||
}
|
||||
|
||||
class BlocProvider<T extends BlocBase> extends StatefulWidget {
|
||||
const BlocProvider({
|
||||
Key? key,
|
||||
required this.child,
|
||||
required this.blocBuilder,
|
||||
this.blocDispose,
|
||||
}) : super(key: key);
|
||||
|
||||
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) {
|
||||
_BlocProviderInherited<T> provider = context
|
||||
.getElementForInheritedWidgetOfExactType<_BlocProviderInherited<T>>()
|
||||
?.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!(bloc);
|
||||
} else {
|
||||
bloc.dispose();
|
||||
}
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return _BlocProviderInherited<T>(
|
||||
bloc: bloc,
|
||||
child: widget.child,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user