bloc_widget_arch 0.0.1 bloc_widget_arch: ^0.0.1 copied to clipboard
A powerful Flutter package for building modular applications with the Bloc Widget Architecture.
Bloc Widget Architecture #
An architecture that introduces a powerful and organized approach to building flutter applications. This package provides an assortment of abstract classes and utilities that seamlessly integrate with the BLoC pattern, enabling you to create clear and maintainable code.
Important #
Note: This package requires iOS version 10.3 or higher for compatibility.
Features #
-
BaseArchBloc: An abstract class at the core of the Bloc Widget Architecture. It serves as a blueprint for structuring widgets that effectively interact with BLoCs. Extend this class to create widgets that respond to BLoC events and efficiently update the UI based on state changes.
-
StatefulBlocWidget: A class designed for crafting stateful widgets that interact with BLoCs. By inheriting from this class, you can effortlessly pair your BLoC with a widget while keeping your codebase modular and clean.
-
StatelessBlocWidget: Designed for the creation of stateless widgets that work harmoniously with BLoCs. Subclassing this abstract class simplifies the process of integrating BLoCs into widgets and ensures that your UI remains responsive and up-to-date.
Usage #
BaseArchBloc #
class ScreenBloc extends BaseArchBloc<ScreenState> {
ScreenBloc()
: super(
ScreenState(
someInt: 0,
),
);
@override
EventBus get eventBus => Modular.get<EventBus>();
@override
void registerEvents() {
super.registerEvents();
listen<SomeEvent>((event) {
updateState(
state.copyWith(
someInt: state.someInt + 1,
),
);
});
}
}
class ScreenState {
final int someInt;
ScreenState({required this.someInt});
}
extension ScreenStateCopyWith on ScreenState {
ScreenState copyWith({
int? someInt,
}) {
return ScreenState(
someInt: someInt ?? this.someInt,
);
}
}
class SomeEvent {}
StatefulBlocWidget #
class ScreenStatefulBlocWidget extends StatefulBlocWidget {
const ScreenStatefulBlocWidget({super.key, required this.someString});
final String someString;
@override
State<StatefulBlocWidget> createState() => ScreenStatefulBlocWidgetState();
}
class ScreenStatefulBlocWidgetState
extends StatefulBlocWidgetState<ScreenBloc, ScreenState> {
ScreenStatefulBlocWidget get customWidget => widget as ScreenStatefulBlocWidget;
@override
ScreenBloc get bloc => Modular.get<ScreenBloc>();
// Set up state objects, controllers, etc.
@override
Widget onBuild(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('BlocWidgetArch'),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Center(
child: Text(
customWidget.someString,
style: TextStyle(fontSize: 18.0),
),
),
Center(
child: Text(
bloc.state.someInt.toString(),
style: TextStyle(fontSize: 16.0),
),
),
SizedBox(
height: 24.0,
),
ElevatedButton(
onPressed: () {
bloc.eventBus.fire(SomeEvent());
},
child: Text('press me'),
),
],
),
);
}
}
StatelessBlocWidget #
class Screen extends StatelessBlocWidget<ScreenBloc, ScreenState> {
const Screen({super.key});
@override
get bloc => Modular.get<ScreenBloc>();
@override
Widget onBuild(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('BlocWidgetArch'),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Center(
child: Text(
bloc.state.someInt.toString(),
style: TextStyle(fontSize: 16.0),
),
),
SizedBox(
height: 24.0,
),
ElevatedButton(
onPressed: () {
bloc.eventBus.fire(SomeEvent());
},
child: Text('press me'),
),
],
),
);
}
}
Getting started #
TODO: List prerequisites and provide or point to information on how to start using the package.
Additional information #
This package was developed with modularity and scalability in mind. It works great with flutter_modular (it was originally developed in a project utilizing it).
License #
This project is licensed under the terms of the MIT License. See the LICENSE file for details.
Author: [Cody L. Bainter]