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 umStreamde inteiros.Timer.periodicé usado para incrementar o contador a cada segundo.StreamBuilderobserva oStreamdoStreamControllere atualiza a interface do usuário quando um novo valor é enviado peloStream.
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.