0
respostas

[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