feat: Introduce PokemonImage component for robust image loading with fallback and shiny support, and update iOS platform to 15.0.

This commit is contained in:
2026-03-20 11:23:22 +01:00
parent 8cca5a64de
commit 4faf259aaa
10 changed files with 160 additions and 33 deletions
+5 -1
View File
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import '../database/pokedex_database.dart';
import '../components/pokemon_image.dart';
class GameOverPage extends StatefulWidget {
const GameOverPage({Key? key}) : super(key: key);
@@ -95,7 +96,10 @@ class _GameOverPageState extends State<GameOverPage> {
if (pokemonImage.isNotEmpty)
SizedBox(
height: 140,
child: Image.network(pokemonImage, fit: BoxFit.contain),
child: PokemonImage(
imageUrl: pokemonImage,
fit: BoxFit.contain,
),
),
const SizedBox(height: 12),
Text(
+12 -7
View File
@@ -4,6 +4,7 @@ import 'package:shared_preferences/shared_preferences.dart';
import '../models/pokemon.dart';
import '../database/pokedex_database.dart';
import 'main_page.dart';
import '../components/pokemon_image.dart';
class GuessPage extends StatefulWidget {
const GuessPage({Key? key}) : super(key: key);
@@ -258,13 +259,17 @@ class _GuessPageState extends State<GuessPage> {
child: Padding(
padding: const EdgeInsets.all(16.0),
child: _isGuessed
? Image.network(_currentPokemon!.imageUrl, fit: BoxFit.contain)
: ColorFiltered(
colorFilter: ColorFilter.mode(
_isShiny ? Colors.yellow[700]! : Colors.black,
BlendMode.srcIn
),
child: Image.network(_currentPokemon!.imageUrl, fit: BoxFit.contain),
? PokemonImage(
imageUrl: _isShiny ? _currentPokemon!.shinyImageUrl : _currentPokemon!.imageUrl,
fallbackUrl: _currentPokemon!.imageUrl,
fit: BoxFit.contain,
)
: PokemonImage(
imageUrl: _isShiny ? _currentPokemon!.shinyImageUrl : _currentPokemon!.imageUrl,
fallbackUrl: _currentPokemon!.imageUrl,
fit: BoxFit.contain,
color: _isShiny ? Colors.yellow[700]! : Colors.black,
colorBlendMode: BlendMode.srcIn,
),
),
),
+6 -1
View File
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import '../models/pokemon.dart';
import '../components/pokemon_type.dart';
import '../components/pokemon_image.dart';
class PokemonDetailPage extends StatefulWidget {
const PokemonDetailPage({Key? key}) : super(key: key);
@@ -126,7 +127,11 @@ class _PokemonDetailPageState extends State<PokemonDetailPage> {
height: 180,
alignment: Alignment.center,
color: const Color(0xFF81CCA5).withAlpha(153), // subtle green background behind sprite
child: Image.network(_isShiny ? pokemon.shinyImageUrl : pokemon.imageUrl, fit: BoxFit.contain),
child: PokemonImage(
imageUrl: _isShiny ? pokemon.shinyImageUrl : pokemon.imageUrl,
fallbackUrl: _isShiny ? pokemon.imageUrl : null,
fit: BoxFit.contain,
),
),
),
Container(