# Flutter Custom BLoC Library

A simple and reusable implementation of the BLoC (Business Logic Component) pattern for Flutter applications. This library provides a way to manage state and business logic using streams, making it easier to separate UI from business logic.

## Features

- **Stream-based State Management**: Utilizes Dart's `Stream` to manage state updates in a reactive manner.
- **BlocProvider**: An InheritedWidget to provide BLoC instances to the widget tree.
- **BlocBuilder**: A widget to rebuild the UI in response to state changes.

## Installation

Add the following dependency to your `pubspec.yaml` file:

```yaml
dependencies:
  flutter:
    sdk: flutter
  flutter_custom_bloc:

Replace yourusername with your GitHub username.

Usage

Creating a Bloc

Create a class that extends the Bloc class:

import 'package:flutter_custom_bloc/flutter_custom_bloc.dart';

class CounterBloc extends Bloc<int> {
  CounterBloc() : super(0);

  void increment() => emit(state + 1);
  void decrement() => emit(state - 1);
}

Providing the Bloc

Wrap your widget tree with BlocProvider to provide the BLoC instance:

import 'package:flutter/material.dart';
import 'package:flutter_custom_bloc/flutter_custom_bloc.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BlocProvider(
        create: () => CounterBloc(),
        child: CounterScreen(),
      ),
    );
  }
}

Building the UI with BlocBuilder

Use BlocBuilder to build your UI based on the current state of the BLoC:

class CounterScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Counter')),
      body: BlocBuilder<CounterBloc, int>(
        builder: (context, state) {
          return Center(
            child: Text('Count: $state'),
          );
        },
      ),
      floatingActionButton: Row(
        mainAxisAlignment: MainAxisAlignment.spaceAround,
        children: [
          FloatingActionButton(
            onPressed: () {
              final bloc = BlocProvider.of<CounterBloc>(context);
              bloc.increment();
            },
            child: Icon(Icons.add),
          ),
          FloatingActionButton(
            onPressed: () {
              final bloc = BlocProvider.of<CounterBloc>(context);
              bloc.decrement();
            },
            child: Icon(Icons.remove),
          ),
        ],
      ),
    );
  }
}

API Reference

Bloc Class

  • Constructor: Bloc(S state) - Initializes the BLoC with an initial state.
  • emit(S state): Emits a new state if it's different from the current state.
  • dispose(): Closes the stream controller to free up resources.
  • reset(): Resets the BLoC to its initial state.

BlocProvider Class

  • Constructor: BlocProvider({Key? key, required Widget child, required T Function() create}) - Creates a new BLoC instance and provides it to the widget tree.
  • of: Returns the BLoC instance of type T from the widget tree.

BlocBuilder Class

  • Constructor: BlocBuilder({Key? key, required Widget Function(BuildContext context, S state) builder}) - Rebuilds the UI when the BLoC emits a new state.

Contributing

Contributions are welcome! Please open an issue or submit a pull request for any enhancements or bug fixes.

License

This project is licensed under the MIT License. See the LICENSE file for more information.