Лучший способ загрузить изображения из сети трепетать - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь загрузить изображения из сети и показать их в GridView.Я использую StatefulWidget и загружаю изображения в методе build.Но, насколько я понимаю, не очень хорошо делать сетевой вызов внутри метода build.Как я могу загрузить изображения из сети внутри моего BLoC файла, а затем передать список загруженных изображений в виджет?Ниже моя текущая реализация.

class MovieList extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return MovieListState();
  }
}

class MovieListState extends State<MovieList> {
  @override
  void initState() {
    super.initState();
    bloc.fetchAllMovies();
  }

  @override
  void dispose() {
    bloc.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Popular Movies'),
      ),
      body: StreamBuilder(
        stream: bloc.allMovies,
        builder: (context, AsyncSnapshot<ItemModel> snapshot) {
          if (snapshot.hasData) {
            return buildList(snapshot);
          } else if (snapshot.hasError) {
            return Text(snapshot.error.toString());
          }
          return Center(child: CircularProgressIndicator());
        },
      ),
    );
  }

  Widget buildList(AsyncSnapshot<ItemModel> snapshot) {
    return GridView.builder(
        itemCount: snapshot.data.results.length,
        gridDelegate:
        new SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
        itemBuilder: (BuildContext context, int index) {
          return GridTile(
            child: InkResponse(
              enableFeedback: true,
              child: Image.network(
                'https://image.tmdb.org/t/p/w185${snapshot.data
                    .results[index].poster_path}',
                fit: BoxFit.cover,
              ),
              onTap: () => openDetailPage(snapshot.data, index),
            ),
          );
        });
  }

  openDetailPage(ItemModel data, int index) {
    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) {
        return MovieDetailBlocProvider(
          child: MovieDetail(
            title: data.results[index].title,
            posterUrl: data.results[index].backdrop_path,
            description: data.results[index].overview,
            releaseDate: data.results[index].release_date,
            voteAverage: data.results[index].vote_average.toString(),
            movieId: data.results[index].id,
          ),
        );
      }),
    );
  }
}

1 Ответ

0 голосов
/ 02 декабря 2018

Я бы порекомендовал вам использовать https://pub.dartlang.org/packages/cached_network_image

Это действительно хорошо работает для моих дел.

Простой пример кода из их r

CachedNetworkImage(
   imageUrl: "http://via.placeholder.com/350x150",
   placeholder: CircularProgressIndicator(),
   errorWidget: Icon(Icons.error),
 ),

или

Image(image: CachedNetworkImageProvider(url))

Вы должны добавить в файл pubspec

cached_network_image: <actual version here>

в раздел зависимостей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...