0
respostas

Lista de exercícios = Biblioteca digital

import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart';

const String urlGist =
    'https://gist.githubusercontent.com/JACursino/0753ed2429dee9484ad3f0f1f504b540/raw/cad163846f0b8cabb88a770e632876e91b6a47d2/books.json';

Future<List<Map<String, dynamic>>> carregarLivros() async {
  try {
    final resposta =
        await get(Uri.parse(urlGist)).timeout(const Duration(seconds: 5)); /* vai aguardar no máximo 5 segundos por uma resposta do servidor */

    if (resposta.statusCode == 200) {
      final List dadosJson = jsonDecode(resposta.body); //jsonDecode converte o texto em estrutura de dados manipulável.
      return dadosJson.cast<Map<String, dynamic>>();
    } else {
      print('Falha ao carregar os dados (status: ${resposta.statusCode}).');
      return [];
    }
  } catch (erro) {
    print('Erro ao conectar-se ao servidor: $erro');
    return [];
  }
}

List<String> extrairAutores(List<Map<String, dynamic>> livros) {
  final Set<String> autores = {};
  for (var livro in livros) {
    autores.add(livro['author']);
  }
  return autores.toList()..sort();
}

List<Map<String, dynamic>> filtrarPorAutor(
    List<Map<String, dynamic>> livros, String autor) {
  return livros
      .where((livro) => livro['author'] == autor)
      .cast<Map<String, dynamic>>() //função do .cast é assegurar que a lista seja do mesmo tipo
      .toList(); //converte a sequência de valores em uma lista completa
}

void exibirLivrosEncontrados(
    List<Map<String, dynamic>> livros, String autor) {
  print('\nLivros de $autor:\n');

  if (livros.isEmpty) {
    print('Nenhuma obra encontrada.');
  } else {
    for (var livro in livros) {
      print('- ${livro['title']} (${livro['year_of_publication']})');
    }
  }
}

void main() async {
  print('--- Bem-vindo(a) à Biblioteca Digital ---');
  print('Conectando à base de dados...\n');

  final List<Map<String, dynamic>> livros = await carregarLivros();

  // Se não conseguir carregar, encerra o programa
  if (livros.isEmpty) {
    print('Não foi possível carregar os dados. Verifique sua conexão.');
    exit(0);
  }

  final List<String> autores = extrairAutores(livros);

  // Loop principal do menu interativo
  while (true) {
    print('\nAutores disponíveis na biblioteca:\n');
    for (var i = 0; i < autores.length; i++) {
      print('${i + 1}. ${autores[i]}');
    }
    print('\n0. Sair');
    stdout.write('\nDigite o número do autor que deseja consultar: ');
    final entrada = stdin.readLineSync();

    if (entrada == '0') {
      print('\nEncerrando o sistema...');
      break;
    }

    final indice = int.tryParse(entrada ?? '');
    if (indice == null || indice < 1 || indice > autores.length) {
      print('Opção inválida. Tente novamente.');
      continue;
    }

    final autorEscolhido = autores[indice - 1];
    final livrosAutor = filtrarPorAutor(livros, autorEscolhido);

    print('\n------------------------------------');
    exibirLivrosEncontrados(livrosAutor, autorEscolhido);
    print('------------------------------------\n');

    stdout.write('Pressione Enter para voltar ao menu...');
    stdin.readLineSync(); // pausa antes de limpar ou voltar
  }

  print('\n--- Fim da execução ---');
}

Matricule-se agora e aproveite até 50% OFF

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

QUERO APROVEITAR