Vamos entender o StreamController e o StreamBuilder com um exemplo prático.


Entendendo o Stream e o StreamController:

  • Stream: É uma sequência de eventos assíncronos que podem ser transmitidos e ouvidos por várias partes do código.

  • StreamController: É responsável por criar e controlar um fluxo de dados assíncronos, permitindo o envio de eventos para um Stream.


Exemplo Prático:

Vamos criar um contador simples que incrementa a cada segundo e exibimos o valor atualizado em tempo real na interface do aplicativo usando StreamController e StreamBuilder.

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CounterApp(),
    );
  }
}

class CounterApp extends StatefulWidget {
  @override
  _CounterAppState createState() => _CounterAppState();
}

class _CounterAppState extends State<CounterApp> {
  final StreamController<int> _streamController = StreamController<int>();
  late int _counter;
  late Timer _timer;

  @override
  void initState() {
    super.initState();
    _counter = 0;
    _timer = Timer.periodic(Duration(seconds: 1), _incrementCounter);
  }

  void _incrementCounter(Timer timer) {
    _counter++;
    _streamController.add(_counter);
  }

  @override
  void dispose() {
    _timer.cancel();
    _streamController.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Counter App'),
      ),
      body: Center(
        child: StreamBuilder<int>(
          stream: _streamController.stream,
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return Text(
                'Contagem: ${snapshot.data}',
                style: TextStyle(fontSize: 24),
              );
            } else {
              return Text('Carregando...');
            }
          },
        ),
      ),
    );
  }
}


Neste exemplo:

  • StreamController<int> é usado para controlar um Stream de inteiros.

  • Timer.periodic é usado para incrementar o contador a cada segundo.

  • StreamBuilder observa o Stream do StreamController e atualiza a interface do usuário quando um novo valor é enviado pelo Stream.

Ao executar este código, você verá um aplicativo com uma barra de título "Counter App" e um texto no corpo da tela que exibe a contagem atualizada a cada segundo, tudo isso devido à atualização contínua do Stream pelo StreamController e a reconstrução da interface pelo StreamBuilder.