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

[Sugestão] Uma solução (provavelmente não a melhor) para a imagem "The Big Lebowski"

Aparentemente a imagem referente ao filme "The Big Leboswki" na url da API, retorna um "Not Found" ao invés de uma imagem. Fiz uma substituição da imagem para outro link sem interferir na API/json e sem mexer nos parâmetros das classes. Como o erro é somente no filme específico, so fiz a checagem desse filme. Caso seja ele, mude a imagem para outra.

Para o arquivo movie_screen.dart

import 'package:bilheteria_panucci/logic/cubit/theme_cubit.dart';
import 'package:flutter/material.dart';
import 'package:bilheteria_panucci/components/movie_screen/tab_bar_movie.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

import '../components/movie_screen/poster.dart';
import '../components/movie_screen/poster_card.dart';
import '../models/movie.dart';

class MovieScreen extends StatelessWidget {
  const MovieScreen({super.key, required this.movie});
  final Movie movie;
  final String notFound =
      "https://user-images.githubusercontent.com/24848110/33519396-7e56363c-d79d-11e7-969b-09782f5ccbab.png";

  @override
  Widget build(BuildContext context) {
    final themeCubit = context.read<ThemeCubit>();
    themeCubit.changeTheme(movie.genre);
    return Scaffold(
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Expanded(
            child: Stack(
              children: [
                !(movie.name == "The Big Lebowski")
                    ? Poster(imageURL: movie.imageURI)
                    : Poster(imageURL: notFound),
                PosterCard(
                  title: movie.name,
                  genre: movie.genre,
                  classification: movie.classification,
                  duration: movie.duration,
                ),
              ],
            ),
          ),
          Expanded(child: TabBarMovie(movie: movie)),
        ],
      ),
    );
  }
}

E para o arquivo movie_card.dart

import 'package:flutter/material.dart';
import 'package:bilheteria_panucci/screens/movie_screen.dart';

import '../models/movie.dart';

class MovieCard extends StatelessWidget {
  const MovieCard({Key? key, required this.movie}) : super(key: key);
  final Movie movie;
  final String notFound =
        "https://user-images.githubusercontent.com/24848110/33519396-7e56363c-d79d-11e7-969b-09782f5ccbab.png";

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Expanded(
          child: Card(
              clipBehavior: Clip.hardEdge,
              child: InkWell(
                  onTap: () {
                    Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) => MovieScreen(movie: movie),
                      ),
                    );
                  },
                  child: movie.imageURI != null
                      ? Ink(
                          width: double.infinity,
                          decoration: BoxDecoration(
                            image: !(movie.name == "The Big Lebowski")
                                ? DecorationImage(
                                    image: NetworkImage(movie.imageURI!),
                                    fit: BoxFit.cover)
                                : DecorationImage(
                                    image: NetworkImage(notFound)),
                          ),
                        )
                      : Ink(
                          child: const Center(
                            child: Icon(Icons.error),
                          ),
                        ))),
        ),
        Text(
          movie.name,
          style: Theme.of(context).textTheme.displaySmall,
        )
      ],
    );
  }
}

Devem existir soluções melhores e mais fáceis, mas eu só pensei em fazer logo. Abraço

1 resposta
solução!

Olá, Heitor!

A sua solução é bastante válida e resolve o problema específico que você encontrou. Você fez uma verificação para a imagem do filme "The Big Lebowski" e, caso seja ele, substituiu a imagem que estava dando erro por outra.

No entanto, como você mesmo mencionou, existem outras formas de lidar com essa situação que podem ser mais genéricas e, portanto, mais robustas. Uma delas seria verificar se a URL da imagem retorna um erro 404 (Not Found) e, nesse caso, substituir a imagem por uma imagem padrão. Dessa forma, o código funcionaria para qualquer filme que tivesse o mesmo problema, não apenas para "The Big Lebowski".

Aqui está um exemplo de como você poderia fazer isso:

Future<String> getImageUrl(String url) async {
  final response = await http.head(Uri.parse(url));
  if (response.statusCode == 200) {
    return url;
  } else {
    return notFound;
  }
}

Você poderia então usar o método getImageUrl para obter a URL da imagem a ser mostrada:

Poster(imageURL: await getImageUrl(movie.imageURI)),

Lembre-se de que essa abordagem requer que você faça uma solicitação HTTP adicional para cada imagem, o que pode ter um impacto no desempenho. Além disso, o método getImageUrl é assíncrono, o que significa que você teria que lidar com o estado de carregamento da imagem.

Espero ter ajudado e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software