flutter图片加载

在 Flutter 中,提供了 Image 组件来描述图片组件,Image 的数据源可以是静态文件、内存以及网络。
在 Image Widget 中,有一个必须的属性 image,它对应的是一个 ImageProvider 。ImageProvider 是一个抽象类,主要定义了图片数据获取的接口 load(),从不同的数据源获取图片需要实现不同的 ImageProvider。

加载本地图片

在 Flutter 中,加载本地图片比加载网络图片还要复杂。。。因为加载本地图片不仅仅是引用本地文件的资源路径,还要进行相关的配置。
步骤一:在工程的根目录创建一个 images 目录,并将图片拷贝至该目录中。

步骤二:在 pubspec.yaml 中的 flutter 部分添加配置:

assets:
  - images/space.jpg

需要注意的是 yaml 的语法,空格以及缩进不能错,修改配置后热重载不会生效,需要重新启动项目。

步骤三:加载图片

Image(
  image: AssetImage("images/space.jpg"),
  width: 100,
)

加载网络图片

转自(https://flutterchina.club/assets-and-images/)
显示图片是大多数移动应用程序的基础。Flutter提供了Image Widget来显示不同类型的图片。

为了处理来自URL的图像,请使用Image.network构造函数。

new Image.network(
'https://raw.githubusercontent.com/flutter/website/master/_includes/code/layout/lakes/images/lake.jpg',
)

Bonus: GIF动画

Image Widget的一个惊艳的功能是:支持GIF动画!

new Image.network(
  'https://github.com/flutter/plugins/raw/master/packages/video_player/doc/demo_ipod.gif?raw=true',
);
完整的例子
import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var title = 'Web Images';

    return new MaterialApp(
      title: title,
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text(title),
        ),
        body: new Image.network(
          'https://github.com/flutter/website/blob/master/_includes/code/layout/lakes/images/lake.jpg?raw=true',
        ),
      ),
    );
  }
}

占位图过渡

当使用默认Image widget显示图片时,您可能会注意到它们在加载完成后会直接显示到屏幕上。这可能会让用户产生视觉突兀。

相反,如果你最初显示一个占位符,然后在图像加载完显示时淡入,那么它会不会更好?我们可以使用[FadeInImage]来达到这个目的!

FadeInImage适用于任何类型的图片:内存、本地Asset或来自网上的图片。

在这个例子中,我们将使用transparent_image包作为一个简单的透明占位图。 您也可以考虑按照Assets和图片指南使用本地资源来做占位图。

new FadeInImage.memoryNetwork(
  placeholder: kTransparentImage,
  image: 'https://github.com/flutter/website/blob/master/_includes/code/layout/lakes/images/lake.jpg?raw=true',
);
完整例子
import 'package:flutter/material.dart';
import 'package:transparent_image/transparent_image.dart';

void main() {
  runApp(new MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final title = 'Fade in images';

    return new MaterialApp(
      title: title,
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text(title),
        ),
        body: new Stack(
          children: <Widget>[
            new Center(child: new CircularProgressIndicator()),
            new Center(
              child: new FadeInImage.memoryNetwork(
                placeholder: kTransparentImage,
                image:
                    'https://github.com/flutter/website/blob/master/_includes/code/layout/lakes/images/lake.jpg?raw=true',
              ),
            ),
          ],
        ),
      ),
    );
  }
}

使用缓存图片

在某些情况下,在从网上下载图片后缓存图片可能会很方便,以便它们可以脱机使用。为此,我们可以使用cached_network_image包来达到目的。

除了缓存之外,cached_image_network包在加载时还支持占位符和淡入淡出图片!

new CachedNetworkImage(
  imageUrl: 'https://github.com/flutter/website/blob/master/_includes/code/layout/lakes/images/lake.jpg?raw=true',
);
添加一个占位符

cached_network_image包允许我们使用任何Widget作为占位符!在这个例子中,我们将在图片加载时显示一个进度圈。

new CachedNetworkImage(
  placeholder: new CircularProgressIndicator(),
  imageUrl: 'https://github.com/flutter/website/blob/master/_includes/code/layout/lakes/images/lake.jpg?raw=true',
);
完整的例子
import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';

void main() {
  runApp(new MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final title = 'Cached Images';

    return new MaterialApp(
      title: title,
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text(title),
        ),
        body: new Center(
          child: new CachedNetworkImage(
            placeholder: new CircularProgressIndicator(),
            imageUrl:
                'https://github.com/flutter/website/blob/master/_includes/code/layout/lakes/images/lake.jpg?raw=true',
          ),
        ),
      ),
    );
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Flutter中,通过Image组件来加载并显示图片,可以从asset、文件、内存以及网络获取图片,都需要实现不同...
    Mariko00o阅读 2,998评论 0 2
  • 刚上手Flutter时会碰到几个图片加载的插件,刚开始可能无所谓性能好坏,能满足我们的需求就是好的插件 ;当我们遇...
    wethereornot阅读 12,194评论 1 17
  • 1. 加载项目中的图片: 在项目根目录中创建 images 文件夹,然后放入三张图片; 在 yaml 文件中添加;...
    ChenME阅读 5,050评论 5 5
  • 一、初识flutter image 在讲解源码之前,我们先看下面几个例子,回顾一下flutter加载图片资源的方式...
    五月_f6d4阅读 11,303评论 3 23
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,589评论 16 22