Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Lista de exercícios - Exercício 1 e 2

Exercício 1: Adicionando um novo produto ao catálogo

import 'dart:convert';

// Simula a String JSON vazia lida de um arquivo ou resposta inicial.
const String catalogoJsonInicial = '[]';

/// Função para adicionar um novo produto a uma lista de Maps (o catálogo).
List<Map<String, dynamic>> adicionarProduto(
    List<Map<String, dynamic>> catalogo,
    int id,
    String name,
    double price
    ) {

    final novoProduto = <String, dynamic>{
        'id': id,
        'name': name,
        'price': price,
    };

    catalogo.add(novoProduto);
    return catalogo;
}

void main() {
    print('1. DECODIFICAÇÃO (Simulando a leitura do arquivo vazio):');
    // DECODE -Transforma a String '[]' em uma List<dynamic> (Lista Dart)
    List<dynamic> catalogo = json.decode(catalogoJsonInicial);
    print('Tipo em Dart após decode: ${catalogo.runtimeType}');

    print('\n2. PROCESSAMENTO (Adicionando os itens do Exercício 1):');
    // Adiciona os 3 produtos à lista Dart
    catalogo = adicionarProduto(catalogo.cast<Map<String, dynamic>>(), 1, 'Celular', 1500.00);
    catalogo = adicionarProduto(catalogo.cast<Map<String, dynamic>>(), 2, 'Notebook', 4500.00);
    catalogo = adicionarProduto(catalogo.cast<Map<String, dynamic>>(), 3, 'Tablet', 800.00);

    print('Catálogo processado: $catalogo');

    print('\n3. CODIFICAÇÃO (Simulando o salvamento/envio):');
    // ENCODE - Transforma a lista Dart atualizada de volta em uma String JSON
    String catalogoFinalJson = json.encode(catalogo);
    print('Resultado final (String JSON):');
    print(catalogoFinalJson);
}

Exercício 2: Enviando dados de um novo produto para a API

import 'dart:convert';
import 'package:dartloja/api_key.dart';
import 'package:http/http.dart'; 

// 1. Defina a URL da API para CRIAR GISTS
const String gistApiUrl = 'https://api.github.com/gists';

/// FUNÇÃO DO EXERCÍCIO 2: Envia um único produto para a API do Gist.
Future<void> enviarNovoProduto(
    int id,
    String name,
    double price
    ) async {

    // 1. Criação do Map (Produto) a ser enviado (nosso objeto Dart)
    final produtoParaEnvio = <String, dynamic>{
        'id': id,
        'name': name,
        'price': price,
    };

    // 2. Codificação do Produto para String JSON (Este será o CONTEÚDO do arquivo Gist)
    final produtoJsonContent = json.encode(produtoParaEnvio);

    // 3. Montagem do corpo da requisição no formato EXIGIDO pela API do Gist
    final gistBody = {
        "description": "Novo Produto (ID $id) adicionado via app Dart",
        "public": true,
        "files": {
            // Nome do arquivo dentro do Gist (foi utilizado o ID para garantir um nome único)
            "produto_$id.json": {
                "content": produtoJsonContent, // A String JSON do nosso produto
            }
        }
    };

    // 4. Codificação final: Montamos a String JSON que será o corpo do POST
    final jsonEncodedBody = json.encode(gistBody);

    // 5. Realização da Requisição POST para CRIAR o Gist
    Response response = await post(
        Uri.parse(gistApiUrl),
        headers: {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer $gitHubToken', // Token de autorização
        },
        body: jsonEncodedBody, // A String JSON final
    );

    // 6. Verificação do Status Code
    if (response.statusCode == 201) {
        print('SUCESSO! Produto (Gist) criado com sucesso!');
        final gistResponse = json.decode(response.body);
        print('Gist criado. URL: ${gistResponse['html_url']}');
    } else {
        print('ERRO ao enviar produto: ${response.statusCode}');
        print('Resposta da API: ${response.body}');
        print('Verifique se o seu GITHUB_TOKEN está correto e tem permissão "gist".');
    }
}

void main() async {
    print('--- Iniciando o Teste do Exercício 2 ---');

    // Teste: Enviar um quarto produto
    await enviarNovoProduto(
        4,
        'Monitor Ultrawide',
        1200.00
    );
}

Matricule-se agora e aproveite até 50% OFF

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

QUERO APROVEITAR
1 resposta
solução!

Olá, José, como vai?

Seu código dos dois exercícios está muito bem organizado e mostra que você entendeu tanto o fluxo de JSON no Dart quanto o uso de requisições HTTP. Gostei bastante de como você documentou os passos com prints explicativos, isso ajuda muito a visualizar o ciclo completo de decodificação, processamento e codificação.

Valeu por compartilhar seu código no fórum. Continue trazendo seus exercícios e experimentos, e sempre que surgir alguma dúvida, o fórum está à disposição.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!