1
resposta

[Dúvida] Dúvida a respeito do tópico "Desafio: outras operações"

A respeito da atividade:

  1. Implemente o método getAccountById que retorna apenas uma Account baseado no id recebido por parâmetro. Você deve decidir como o programa vai se comportar se o id for inválido.

Eu tive uma primeira forma de fazer que seria:

Future<Account?> getAccountById(String id) async {
  List<Account> accounts = await getAll();

  // O orElse deve retornar um Account? e não null diretamente
  Account? accountFound = accounts.firstWhere(
    (element) => element.id == id,
    orElse: () => null, // Aqui você pode retornar null
  );

  return accountFound; // Retorna accountFound, que pode ser null
}

Mas eu me deparava com o erro "The returned type 'Null' isn't returnable from a 'Account' function, as required by the closure's context" e tentei contornar de algumas formas, como:

  • tentar remover o null e retornar uma Account sem valor
  • explicitar que o retorno poderia ser null mas nenhuma resolveu.

Então optei por remover o "OrElse()" que foi quando o código rodou

Future<Account?> getAccountById(String id) async {
    List<Account> accounts = await getAll();

    // O orElse deve retornar um Account? e não null diretamente
    Account? accountFound = accounts.firstWhere(
      (element) => element.id == id,
    );

    return accountFound;
  }

e ainda adicionei uma outra função no mesmo arquivo para verificar o retorno e somente enviar a resposta na main, assim deixando o código modularizado e limpo:

void readAccountById(AccountService accountService, String id) {
    accountService.getAccountById(id).then((account) {
      if (account != null) {
        print("Conta encontrada: ${account.toMap()}");
      } else {
        print("Conta não encontrada.");
      }
    }).catchError((error) {
      print("Ocorreu um erro: $error");
    });
  }

Aqui seria a execução na main:

import 'package:dart_async/services/account_service.dart';

void main() {

  // AccountScreen accountScreen = AccountScreen();
  // accountScreen.initializeStream();
  // accountScreen.runChatBot();

  AccountService account = AccountService();

  account.readAccountById(account, "ID001");
}

Imagem da resposta da execução da main para pegar um valor por ID da API no GistGostaria de saber se tem alguma outra forma de ter resolvido e também se esta forma está correta. Agradeço desde já a tenção

1 resposta

Olá, Antony, como vai?

Seu código está válido e atende bem ao solicitado na atividade. A separação entre a lógica de busca e a apresentação na main é uma boa prática, e o uso de then e catchError para tratar o futuro também está bem aplicado. O código modularizado mantém sua aplicação clara e organizada.

Agora, respondendo à sua pergunta sobre outras formas de resolver: o trecho abaixo também é uma alternativa válida e que pode ser usada para melhorar a robustez do código:

 Future<Account?> getAccountById(String id) async {
    List<Account> listAccounts = await getAll();
    try {
      Account account = listAccounts.firstWhere((account) => account.id == id);
      return account;
    } catch (e) {
      return null; 
    }
  }

No main.dart:

void main() async {
  AccountService accountService = AccountService();

    print("\nBuscando conta");
    Account? account = await accountService.getAccountById("ID009");
    print(account != null
        ? "Conta encontrada: ${account.name}"
        : "Conta não encontrada.");

}

No meu caso, eu optei por usar o try/catch e retornei null caso houvesse um erro, e fazer esse tratamento já ao imprimir o resultado.

Espero ter ajudado!

Siga firme nos seus estudos e conte com o fórum sempre que precisar!

Abraços :)

Caso este post tenha lhe ajudado, por favor, marcar como solucionado