Em programação assíncrona e no contexto de StreamController em Dart/Flutter, o termo "sink" refere-se à entrada na qual dados são adicionados para serem enviados pelo Stream associado a um StreamController.


Significado do Sink:

  • Entrada de Dados: O Sink é basicamente a porta de entrada que permite adicionar dados a um Stream controlado por um StreamController. Ele representa o ponto de origem onde os dados são inseridos no fluxo.

  • Adição de Dados: Usando um Sink, você pode adicionar elementos (eventos) ao Stream que está sendo controlado pelo StreamController.


Uso do Sink com StreamController:

import 'dart:async';

void main() {
  // Cria um StreamController que controla um Stream de inteiros
  StreamController<int> streamController = StreamController<int>();

  // Obtém o Sink associado ao StreamController
  Sink<int> sink = streamController.sink;

  // Adiciona dados ao Stream usando o Sink
  sink.add(1);
  sink.add(2);
  sink.add(3);

  // Fecha o StreamController após a conclusão do uso
  streamController.close();
  // Não terá nenhuma saída no console o código acima
}


Neste exemplo:

  • Um StreamController é criado para controlar um Stream de inteiros.

  • O método sink é utilizado para obter o Sink associado ao StreamController.

  • Usando o Sink, são adicionados números (1, 2, 3) ao Stream controlado pelo StreamController.


Add no Sink ou no StreamController?

Na prática, não há diferença entre usar o método add diretamente no StreamController ou no Sink associado a ele, pois o método add do StreamController é, na verdade, um redirecionamento para o método add do Sink.

Quando você usa o método streamController.add() diretamente no StreamController, o StreamController chama internamente o método add do Sink associado a ele.


Exemplo:

import 'dart:async';

void main() {
  // Cria um StreamController que controla um Stream de inteiros
  StreamController<int> streamController = StreamController<int>();

  // Obtém o Sink associado ao StreamController
  Sink<int> sink = streamController.sink;

  // Adiciona dados ao Stream usando o método add do StreamController
  streamController.add(1);
  streamController.add(2);
  streamController.add(3);

  // Adiciona dados ao Stream usando o Sink associado ao StreamController
  sink.add(4);
  sink.add(5);
  sink.add(6);

  // Fecha o StreamController após a conclusão do uso
  streamController.close();
}


Neste exemplo, streamController.add() e sink.add() são equivalentes e adicionam dados da mesma maneira ao Stream controlado pelo StreamController.

Ambos os métodos são formas válidas de adicionar dados a um Stream através do StreamController. O uso direto do método add no StreamController ou no Sink depende da preferência do desenvolvedor ou do contexto específico do código.