flutter - 从网络 flutter 中加载图像的更好方法

标签 flutter

我正在尝试从网络加载图像并在 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,
          ),
        );
      }),
    );
  }
}

最佳答案

您可以使用 loadingBuilder,它是 flutter for Image.Network 的内置功能

       Image.network(
                  widget.networkUrl,
                  fit: BoxFit.fill,
                  loadingBuilder: (BuildContext context, Widget child,
                      ImageChunkEvent? loadingProgress) {
                    if (loadingProgress == null) return child;
                    return Center(
                      child: CircularProgressIndicator(
                        value: loadingProgress.expectedTotalBytes != null
                            ? loadingProgress.cumulativeBytesLoaded /
                                loadingProgress.expectedTotalBytes!
                            : null,
                      ),
                    );
                  },
                ),

关于flutter - 从网络 flutter 中加载图像的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53577962/

相关文章:

Flutter Web 应用程序无法在移动浏览器上运行。手机浏览器运行flutter代码报错怎么调试?

firebase - Firebase:注销停留在加载后登录

Flutter 2.0 - 自动完成小部件从右侧退出屏幕

flutter - Dart/Flutter : azureblob headers - The metadata specified is invalid. 包含不允许的字符

flutter - 在 flutter 中使用 ScreenUtil 库时出错

flutter - 当按下按钮时,如何使IconButton保持TextField内部的焦点不突出文本字段?

flutter - 如何在 flutter 中每隔 x 秒从 api 获取数据?

flutter - 多个平台的文本字段警报对话框

flutter - 在 Freezed 中,是否可以从现有的卡住数据类创建联合案例

android-studio - flutter 医生 : Flutter and dart plugins not installed