Sobes.tech
Junior — Middle

Explique a diferença entre Subject e BehaviorSubject no contexto da programação reativa

sobes.tech IA

Resposta da IA

Na programação reativa, especialmente em bibliotecas como RxDart, Subject e BehaviorSubject são tipos especiais de fluxos (Streams) que permitem ser tanto uma fonte de dados (Observable) quanto um ouvinte (Observer).

  • Subject é simplesmente um fluxo que pode aceitar novos valores e transmiti-los aos assinantes. No entanto, se um assinante se conecta após os valores já terem sido enviados, ele não receberá esses valores anteriores.

  • BehaviorSubject difere ao armazenar o último valor enviado e imediatamente fornecê-lo a qualquer novo assinante. Isso é útil quando se deseja que os novos assinantes recebam imediatamente o estado atual.

Exemplo em Dart usando RxDart:

import 'package:rxdart/rxdart.dart';

void main() {
  final subject = PublishSubject<int>(); // PublishSubject é um equivalente de Subject
  final behaviorSubject = BehaviorSubject<int>();

  subject.add(1);
  behaviorSubject.add(1);

  subject.listen((value) => print('Ouvinte Subject: $value'));
  behaviorSubject.listen((value) => print('Ouvinte BehaviorSubject: $value'));

  subject.add(2);
  behaviorSubject.add(2);

  // Saída:
  // Ouvinte BehaviorSubject: 1
  // Ouvinte Subject: 2
  // Ouvinte BehaviorSubject: 2
}

Aqui, é possível ver que o BehaviorSubject emite imediatamente o último valor (1) para um novo assinante, enquanto o Subject não faz isso.