import 'package:flutter/material.dart'; import '../models/pokemon.dart'; import '../components/pokemon_tile.dart'; import '../database/pokedex_database.dart'; import '../api/pokemon_api.dart'; class PokemonListPage extends StatefulWidget { const PokemonListPage({Key? key}) : super(key: key); @override State createState() => _PokemonListPageState(); } class _PokemonListPageState extends State { String _filter = 'ALL'; // ALL, CAUGHT, NEW int _caughtCount = 0; @override void initState() { super.initState(); _loadPokemonData(); } Future _loadPokemonData() async { final count = await PokedexDatabase.getCaughtCount(); setState(() { _caughtCount = count; }); // Check if database is empty for initial sync List localData = await PokedexDatabase.getPokemonList(); if(localData.isEmpty) { try { final List remoteData = await PokemonApi.getAllPokemon(); // Insert first 151 for (var p in remoteData) { if(p.id > 151) break; await PokedexDatabase.insertPokemon(p); } } catch (e) { debugPrint(e.toString()); } } if (mounted) { setState(() {}); } } Widget _buildPokemonTile(BuildContext context, int index) { return FutureBuilder( future: PokedexDatabase.getPokemon(index + 1), builder: (context, snapshot) { if (!snapshot.hasData || snapshot.data == null) { return const SizedBox( height: 90, child: Center(child: CircularProgressIndicator()), ); } final pokemon = snapshot.data!; // Apply filter logic if (_filter == 'CAUGHT' && !pokemon.isCaught) { return const SizedBox.shrink(); } if (_filter == 'NEW' && pokemon.isCaught) { return const SizedBox.shrink(); } return PokemonTile(pokemon); }, ); } @override Widget build(BuildContext context) { return Container( decoration: const BoxDecoration( color: Color(0xFFC8D1D8), // Silver-ish grey background ), child: Column( children: [ // Header Container( padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 12.0), color: const Color(0xFF90A4AE), child: const Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Icon(Icons.menu, color: Colors.black87), Text( 'LIST - KANTO', style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold, letterSpacing: 2), ), Icon(Icons.search, color: Colors.black87), ], ), ), // Tabs Container( color: const Color(0xFF90A4AE), height: 40, child: Row( children: [ _buildTab('ALL', _filter == 'ALL'), _buildTab('CAUGHT', _filter == 'CAUGHT'), _buildTab('NEW', _filter == 'NEW'), ], ), ), // Caught Count Bar Container( padding: const EdgeInsets.symmetric(vertical: 12.0), decoration: const BoxDecoration( color: Color(0xFFB0BEC5), border: Border(bottom: BorderSide(color: Color(0xFF78909C), width: 2)), ), child: Column( children: [ Text( '${_caughtCount.toString().padLeft(3, '0')} / 151', style: const TextStyle(fontSize: 32, fontWeight: FontWeight.bold), ), const Text( 'POKEMON DISCOVERED', style: TextStyle(fontSize: 14, color: Colors.black54, letterSpacing: 1), ), ], ), ), // The List Expanded( child: Stack( children: [ // Scanlines effect Positioned.fill( child: ListView.builder( itemCount: 100, // drawing artificial scanlines physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, index) => Container( height: 4, margin: const EdgeInsets.only(bottom: 4), color: Colors.black.withAlpha(2), ), ), ), ListView.builder( padding: const EdgeInsets.all(12), itemCount: 151, itemBuilder: _buildPokemonTile, ), ], ), ), // Footer Container( height: 24, color: const Color(0xFF1B2333), alignment: Alignment.center, child: const Text( 'KANTO REGIONAL POKEDEX V2.0', style: TextStyle(color: Colors.white70, fontSize: 12, letterSpacing: 1), ), ), ], ), ); } Widget _buildTab(String title, bool isSelected) { return Expanded( child: GestureDetector( onTap: () { setState(() { _filter = title; }); }, child: Container( decoration: BoxDecoration( color: isSelected ? const Color(0xFFB0BEC5) : Colors.transparent, border: isSelected ? const Border( bottom: BorderSide(color: Color(0xFFD32F2F), width: 3), ) : null, ), alignment: Alignment.center, child: Text( title, style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: isSelected ? Colors.black : Colors.black54, ), ), ), ), ); } }