Provides BLoC(Business Logic Component) to descendant widget (O(1)), and the bloc is disposed automatically by the state which the bloc_provider holds internally.
bloc_provider
was one of the good choice for BLoC pattern until early 2019, but I now recommend to use these instead.
- provider
- disposable_provider
- Thin wrapper of Provider and it calls dispose automatically.
- bloc
- riverpod
bloc_provider
will now be minimally maintained.
class CounterBloc implements Bloc {
final _countController = BehaviorSubject<int>.seeded(0);
final _incrementController = PublishSubject<void>();
CounterBloc() {
_incrementController
.scan<int>((sum, _v, _i) => sum + 1, 0)
.pipe(_countController);
}
ValueStream<int> get count => _countController;
Sink<void> get increment => _incrementController.sink;
@override
void dispose() async {
await _incrementController.close();
await _countController.close();
}
}
void main() => runApp(
// Create and provide the bloc.
BlocProvider<CounterBloc>(
creator: (_context, _bag) => CounterBloc(),
child: App(),
),
);
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
// Access the bloc with O(1) computation complexity.
final bloc = BlocProvider.of<CounterBloc>(context);
return MaterialApp(
home: Scaffold(
body: Center(
child: StreamBuilder<int>(
stream: bloc.count,
initialData: bloc.count.value,
builder: (context, snap) => Text(
'count: ${snap.data}',
style: Theme.of(context).textTheme.title,
),
),
),
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.add),
onPressed: () => bloc.increment.add(null),
),
),
);
}
}
- Computational complexity of
of
method, which is used for accessing the bloc isO(1)
. - Provided bloc will be disposed when the inner state is disposed 👍
- https://github.com/mono0926/bloc_provider/tree/master/example
- mono0926/wdb106-flutter
- TaskShare/taskshare-flutter
- Flutter の BLoC(Business Logic Component)のライフサイクルを正確に管理して提供する Provider パッケージの解説
- Japanese only, currently🙇🇯🇵
Please file feature requests and bugs at the issue tracker.