Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Erro para fazer o chatbot

Olá. estou tendo esse erro:

poderiam me audar. segue abaixo os códigos.

import 'package:banco/screens/account_screen.dart';

void main(){
    AccountScreen accountScreen = AccountScreen();
    accountScreen.inicializeStream();
    accountScreen.runChatbot();
} 
import 'dart:async';
import 'package:banco/apikey.dart';
import 'package:banco/models/account.dart';
import 'package:http/http.dart';
import 'dart:convert';
class AccountService{
  final StreamController<String> _streamController = StreamController<String>();
  Stream<String> get streamInfos => _streamController.stream;
  String url = "https://api.github.com/gists/35f64ffee91c7789fd08184d21deab0a";


  Future<List<Account>> getAll() async{
    
    Response response = await get(Uri.parse(url));
    _streamController.add("${DateTime.now()} | requisicao de leitura");
    Map<String,dynamic> mapResponse = json.decode(response.body);
    List<dynamic> listDynamic = json.decode(mapResponse["files"]["accounts.json"]["content"]);
    List<Account> listAccounts = [];
    for (dynamic dyn in listDynamic){
      Map<String,dynamic> mapAccount = dyn as Map<String,dynamic>;
      Account account = Account.fromMap(mapAccount);
      listAccounts.add(account);
    }
    return listAccounts;
  }

  addAccount(Account account) async{
    List <Account> listAccounts = await getAll();
    listAccounts.add(account);
    List<Map<String,dynamic>> listContent=[];

    for (Account account in listAccounts){
      listContent.add(account.toMap());
    }
  String content = jsonEncode(listContent);
  Response response = await post(Uri.parse(url),headers: {
    "Authorization" : "Bearer $apiKey"
    }, body: json.encode({
      "description" : "accounts.json",
      "public":true,
      "files":{
        "accounts.json":{
          "content":content,
        }
      }

    }));
    if (response.statusCode.toString()[0]== '2'){
        _streamController.add("${DateTime.now()} | requisicao de adição bem sucedida(${account.name}).");

    }else{
        _streamController.add("${DateTime.now()} | requisicao de adição falhou(${account.name}).");

    }
  }
}
import 'dart:io';

import 'package:banco/models/account.dart';
import 'package:banco/services/accountservice.dart';

class AccountScreen {
  final AccountService _accountService = AccountService();

  void inicializeStream(){
    _accountService.streamInfos.listen((event) {
      print(event);
    },);
  }
  void runChatbot() async{
    print("Seja bem vindo ao Banco. Sou Roger.\n");

    bool isRunning = true;
    while(isRunning){
      print("Como posso te ajudar");
      print("Digite 1 para ver todas as contas");
      print("Digite 2 para adicionar uma conta");
      print("Digite 3 para sair.\n");
      String? input = stdin.readLineSync();
      if (input != null){
        switch(input){
          case '1':
          {
            await _getAllAccounts();
            break;
          }
          case '2':{
            await _addExampleAccount();
            break;
          }
          case '3':
          {
            isRunning = false;
            print("Te vejo na Proxima");
            break;
          }
          default:
          {
            print("Não entendi. Digite novamente");
          }
        }
      }
    }
  }

  _getAllAccounts()async{
    List<Account> listAccounts = await _accountService.getAll();
    print(listAccounts);
  }

  _addExampleAccount()async{
    Account example = Account(id: "ID555", name: "Jose", lastName: "Buzo", balance: 0);
    await _accountService.addAccount(example);
  }
  

}
class Account {
  String id;
  String name;
  String lastName;
  double balance;

  Account({required this.id,
    required this.name,
    required this.lastName,
    required this.balance});

  factory Account.fromMap(Map<String,dynamic>map){
    return Account(id: map["id"], name: map["name"], lastName: map["lastName"], balance: map["balance"],);
  }

  Map<String,dynamic> toMap(){
    return<String,dynamic>{
      "id" : id,
      "name" : name,
      "lastName" : lastName,
      "balance" : balance,
    };
  }
}

Matricule-se agora e aproveite até 50% OFF

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

QUERO APROVEITAR
3 respostas

Olá, estudante, como vai?

Esse erro está acontecendo porque o campo balance da sua classe Account é double, mas tem algum valor que vem do JSON em Account.fromMap que está chegando como int (por exemplo, 0 em vez de 0.0). Quando o Dart tenta montar o objeto, ele encontra um int onde espera um double e lança essa exceção em tempo de execução.

Tenta converter explicitamente o valor para double, usando num como intermediário. Ficaria assim:

factory Account.fromMap(Map<String, dynamic> map) {
  return Account(
    id: map["id"] as String,
    name: map["name"] as String,
    lastName: map["lastName"] as String,
    balance: (map["balance"] as num).toDouble(),
  );
}

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

Obrigado. A opção 2 e 3 funcionaram agora. mais quando eu coloco a opção 1 aparece assim.

2025-11-16 16:56:36.873338 | requisicao de adição bem sucedida(Jose).
[Instance of 'Account', Instance of 'Account', Instance of 'Account', Instance of 'Account', Instance of 'Account', Instance of 'Account', Instance of 'Account', Instance of 'Account', Instance of 'Account', Instance of 'Account', Instance of 'Account', Instance of 'Account']

O que pode ser???

solução!

Olá, estudante.

Você está recebendo Instance of 'Account' porque a classe Account não possui um método toString. Quando o Dart imprime uma lista de objetos, ele tenta chamar toString em cada um deles e, como não há implementação própria, ele mostra apenas o tipo da classe.

Ao sobrescrever toString, você controla como cada conta será exibida no terminal. Por exemplo, pode retornar algo legível com nome, id e saldo. Assim, sempre que a lista for impressa, cada item aparecerá de forma clara.

Um exemplo seria incluir na classe Account o seguinte método:

@override
String toString(){
  return 'ID: $id | Nome: $name $lastName | Saldo: $balance';
}