Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Lista de exercícios - 4; 5;

Exercício 4: Ouvindo as atualizações da stream

Arquivo: lib/task_manager.dart - trecho do código utilizado

class TaskManager {
  // ... atributos e stream do exercicio 2 ...
  
  // Adiciona uma nova tarefa
  void addTask(Task task) {
    _listTasks.add(task);
    _streamController.add("Tarefa '${task.title}' foi adicionada!");
  }
  
  // Alterna o status de conclusao de uma tarefa
  void toggleTaskStatus(String id) {
    int index = _listTasks.indexWhere((task) => task.id == id);
    
    if (index != -1) {
      _listTasks[index].isCompleted = !_listTasks[index].isCompleted;
      
      String status = _listTasks[index].isCompleted ? 'COMPLETA' : 'INCOMPLETA';
      _streamController.add("Tarefa '${_listTasks[index].title}' foi marcada como $status!");
    }
  }
  
  // Retorna todas as tarefas
  List<Task> getAll() {
    return _listTasks;
  }
  
  // Busca uma tarefa por ID
  Task getById(String id) {
    return _listTasks.firstWhere((task) => task.id == id);
  }
  
  // Remove uma tarefa por ID
  void delete(String id) {
    Task task = getById(id);
    _listTasks.removeWhere((task) => task.id == id);
    _streamController.add("Tarefa '${task.title}' foi REMOVIDA!");
  }
  
  // Fecha o StreamController
  void dispose() {
    _streamController.close();
  }
}

Exercício 5: Testando comportamento de notificações

Arquivo bin/main.dart

import 'package:listacompras/task.dart';
import 'package:listacompras/task_manager.dart';

void main() async {
  print('=== GERENCIADOR DE LISTA DE COMPRAS ===\n');

  final taskManager = TaskManager();

// Criar o ouvinte para as notificacoes
  final subscription = taskManager.notificationStream.listen((mensagem) {
    print('[NOTIFICACAO] $mensagem');
  });

  // Pequeno delay para garantir que o listener esta pronto
  await Future.delayed(Duration(milliseconds: 10));

  // Adicionar tres tarefas
  taskManager.addTask(Task(
    id: '1',
    title: 'Comprar Leite',
    description: 'Comprar 2 litros de leite integral.',
  ));
  await Future.delayed(Duration(milliseconds: 50));

  taskManager.addTask(Task(
    id: '2',
    title: 'Comprar Pão',
    description: 'Comprar pão francês.',
  ));
  await Future.delayed(Duration(milliseconds: 50));

  taskManager.addTask(Task(
    id: '3',
    title: 'Comprar ovos',
    description: 'Comprar 1 dúzia de ovos.',
  ));
  await Future.delayed(Duration(milliseconds: 50));

  // Visualizar todas as tarefas
  print('\n--- TODAS AS TAREFAS ---');
  for (var task in taskManager.getAll()) {
    print(task);
  }

  // Completar a primeira tarefa
  print('\n');
  taskManager.toggleTaskStatus('1');
  await Future.delayed(Duration(milliseconds: 50));

  // Visualizar a primeira tarefa
  print('\n--- TAREFA ESPECIFICA ---');
  Task task1 = taskManager.getById('1');
  print('$task1 - ${task1.description}');

  // Deletar a segunda tarefa
  print('\n');
  taskManager.delete('2');
  await Future.delayed(Duration(milliseconds: 50));

  // Visualizar todas novamente
  print('\n--- TODAS AS TAREFAS (ATUALIZADO) ---');
  for (var task in taskManager.getAll()) {
    print(task);
  }

  // Aguardar processamento final
  await Future.delayed(Duration(milliseconds: 100));

  // Limpar recursos
  await subscription.cancel();
  taskManager.dispose();

  print('\n=== FIM ===');
}

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
1 resposta
solução!

Olá, José, como vai?

A lógica de adicionar mensagens ao StreamController está coerente e a alternância de status da tarefa está funcionando de forma clara dentro do fluxo proposto pelo exercício. A estrutura das mensagens enviadas ao stream está adequada e a forma como você controla o listener na main garante que as notificações apareçam no momento certo.

Seu exercício está muito bem encaminhado e obrigado por compartilhar seu código. Continue trazendo suas soluções, o fórum está à disposição.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!