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
);
}