Exercício 1: Criando o modelo de tarefa
Arquivo: lib/task.dart
// Classe - tarefa da lista de compras
class Task {
String id;
String title;
String description;
bool isCompleted;
// Construtor - cria uma nova tarefa
Task({
required this.id,
required this.title,
required this.description,
this.isCompleted = false, // Tarefas novas iniciam como NÃO concluidas
});
// Converte o objeto Task em um Map
Map<String, dynamic> toMap() {
return {
'id': id,
'title': title,
'description': description,
'isCompleted': isCompleted,
};
}
// Cria um objeto Task a partir de um Map
factory Task.fromMap(Map<String, dynamic> map) {
return Task(
id: map['id'],
title: map['title'],
description: map['description'],
isCompleted: map['isCompleted'] ?? false,
);
}
// Metodo para imprimir a tarefa de forma legivel
@override
String toString() {
String status = isCompleted ? '[X]' : '[ ]';
return '$status $title';
}
}
Exercício 2: Implementando um controlador de stream
Arquivo: lib/task_manager.dart - trecho do código utilizado
import 'dart:async';
import 'task.dart';
class TaskManager {
final List<Task> _listTasks = [];
// StreamController para gerenciar notificacoes
final StreamController<String> _streamController = StreamController<String>();
// Getter para expor a stream (somente leitura)
Stream<String> get notificationStream => _streamController.stream;
// ... resto dos metodos ...
// Metodo para fechar o StreamController
void dispose() {
_streamController.close();
}
}
Exercício 3: Enviando atualizações para a stream
Arquivo: bin/main.dart - trecho do código utilizado
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');
});
// ... continuação do código ...
}