Flutter -BLoC pattern

The definition of this pattern:

  • All inputs are streams.
  • All outputs are streams.
  • BLoC is a simple class that moves logic away from the interface.

Stream counter using the BLoC pattern:

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

class MyCounter extends StatelessWidget {
  final CounterBloc counterBloc = CounterBloc();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Builder'),
      ),
      body: Builder(
        builder: (BuildContext context) {
          return Container(
            child: StreamBuilder<int>(
                stream: counterBloc.getCount,
                builder: (context, snapshot) {
                  if (snapshot.connectionState == ConnectionState.active) {
                    return Text(
                      '${snapshot.data.toString()}',
                      style: Theme.of(context).textTheme.display1,
                    );
                  } else if (snapshot.connectionState ==
                      ConnectionState.waiting) {
                    return Text(
                      'No data yet',
                      style: Theme.of(context).textTheme.display1,
                    );
                  } else if (snapshot.connectionState == ConnectionState.done) {
                    return Text('Done!');
                  } else if (snapshot.hasError) {
                    return Text('Error!');
                  } else {
                    return Text(snapshot.connectionState.toString());
                  }
                }),
          );
        },
      ),
      floatingActionButton: Row(
        mainAxisAlignment: MainAxisAlignment.end,
        children: <Widget>[
          FloatingActionButton(
            onPressed: () => counterBloc.decreaseCounter,
            child: Icon(Icons.exposure_neg_1),
            backgroundColor: Theme.of(context).primaryColor,
            mini: true,
          ),
          FloatingActionButton(
            onPressed: () => counterBloc.increaseCounter,
            child: Icon(Icons.exposure_plus_1),
            backgroundColor: Theme.of(context).primaryColor,
            mini: true,
          ),
        ],
      ),
    );
  }
}

class CounterBloc {
  final StreamController _controller = StreamController<int>();
  int _counter = 1;

  CounterBloc() {
    Timer.periodic(Duration(seconds: 2), (timer) {
      _controller.sink.add(_counter++);
    });
  }

  Stream get getCount => _controller.stream;

  get increaseCounter => _controller.sink.add(_counter++);
  get decreaseCounter => _controller.sink.add(_counter--);

  // void increaseCounter() {
  //   _controller.sink.add(_counter++);
  // }

  // void decreaseCounter() {
  //   _controller.sink.add(_counter--);
  // }

  void dispose() {
    _controller.close();
  }
}

https://medium.com/@alexawaikin/bloc-pattern-for-flutter-on-the-classic-counter-example-d7af74df9a76