美文网首页Flutter 实战
Flutter入门(9):Flutter 组件之 Image、A

Flutter入门(9):Flutter 组件之 Image、A

作者: Maojunhao | 来源:发表于2020-09-09 11:17 被阅读0次

    1. 基本介绍

    Image 组件非常常用,用来加载图片(本地图片和网络图片)。

    2. 示例代码

    代码下载地址。如果对你有帮助的话记得给个关注,代码会根据我的 Flutter 专题不断更新。

    3. AssetImage 创建、导入、使用

    3.1 资源文件创建

    我们现在根目录下创建 images 文件夹。


    image asset.png

    3.2 资源文件导入

    我们创建了一个 base_widgets 的子文件夹,在这里存放 base_widgets 项目里需要使用的图片。
    我这里下载了3个星星图片,分别为 star_black.png, star_black@2x.png, star_black@3x.png,将 star_black.png 图片直接放入 base_widgets 文件夹下,star_black@2x.png 放在 base_widgets/2.0x 文件夹下,star_black@3x.png 放在 base_widgets/3.0x 文件夹下。
    Flutter 会根据需要自动使用对应分辨率图片。

    3.3 资源文件使用

    Flutter 使用资源文件,必须依赖 pubspec.yaml 文件。

    flutter:
      # The following line ensures that the Material Icons font is
      # included with your application, so that you can use the icons in
      # the material Icons class.
      uses-material-design: true
    
      # To add assets to your application, add an assets section, like this:
      assets:
        - images/base_widgets/star_black.png
    

    注意:这里会比较坑,有时候会莫名其妙的报错。检查一下 assets 的首行缩进,assets 前边是2个英文空格,- images/... 前边是4个英文空格。

    images format.png

    4. Image 组件

    4.1 基本创建方式

    • Image:通过ImageProvider来加载图片
    • Image.asset:用来加载本地资源图片
    • Image.file:用来加载本地(File文件)图片
    • Image.network:用来加载网络图片
    • Image.memory:用来加载Uint8List资源(byte数组)图片

    4.2 容器创建

    优雅的编程,首先创建一个 image.dart 文件。我们先给本地图片创建一个30 * 60 的占位框,然后在这些框内展示一下图片的不同拉伸方式。

    import 'package:flutter/material.dart';
    
    class FMImageVC extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Container(
          child: Scaffold(
            appBar: AppBar(
              title: Text(
                "Image",
              ),
              backgroundColor: Colors.lightBlue,
            ),
            body: Container(
              color: Colors.grey,
              child: _listview(),
            ),
          ),
        );
      }
    
      ListView _listview(){
        return ListView(
          padding: const EdgeInsets.all(30),
          children: [
            Text("本地图片"),
            Container(
              height: 150,
              child: _localRow(),
            ),
          ],
        );
      }
    
      Row _localRow(){
        return Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            Container(
              width: 30,
              height: 60,
              color: Colors.yellow,
            ),
            Container(
              width: 30,
              height: 60,
              color: Colors.yellow,
            ),
            Container(
              width: 30,
              height: 60,
              color: Colors.yellow,
            ),
            Container(
              width: 30,
              height: 60,
              color: Colors.yellow,
            ),
            Container(
              width: 30,
              height: 60,
              color: Colors.yellow,
            ),
            Container(
              width: 30,
              height: 60,
              color: Colors.yellow,
            ),
            Container(
              width: 30,
              height: 60,
              color: Colors.yellow,
            ),
          ],
        );
      }
    }
    
    image local background.png

    4.2 本地图片的加载以及不同的 fit 方式

      Row _localRow(){
        return Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            Container(
              width: 30,
              height: 60,
              color: Colors.yellow,
              child: Image.asset(
                'images/base_widgets/star_black.png', fit: BoxFit.none,
              ),
            ),
            Container(
              width: 30,
              height: 60,
              color: Colors.yellow,
              child: Image(
                image: AssetImage('images/base_widgets/star_black.png'),
                fit: BoxFit.fill,
              ),
            ),
            Container(
              width: 30,
              height: 60,
              color: Colors.yellow,
              child: Image(
                image: AssetImage('images/base_widgets/star_black.png'),
                fit: BoxFit.cover,
              ),
            ),
            Container(
              width: 30,
              height: 60,
              color: Colors.yellow,
              child: Image(
                image: AssetImage('images/base_widgets/star_black.png'),
                fit: BoxFit.contain,
              ),
            ),
            Container(
              width: 30,
              height: 60,
              color: Colors.yellow,
              child: Image(
                image: AssetImage('images/base_widgets/star_black.png'),
                fit: BoxFit.fitHeight,
              ),
            ),
            Container(
              width: 30,
              height: 60,
              color: Colors.yellow,
              child: Image(
                image: AssetImage('images/base_widgets/star_black.png'),
                fit: BoxFit.fitWidth,
              ),
            ),
            Container(
              width: 30,
              height: 60,
              color: Colors.yellow,
              child: Image(
                image: AssetImage('images/base_widgets/star_black.png'),
                fit: BoxFit.scaleDown,
              ),
            ),
          ],
        );
    
    image local.png

    4.3 网络图片使用

      ListView _listview(){
        return ListView(
          padding: const EdgeInsets.all(30),
          children: [
            Text("本地图片"),
            Container(
              height: 150,
              child: _localRow(),
            ),
            Text("网络图片"),
            Image.network('http://tiebapic.baidu.com/forum/w%3D580/sign=a96ca741eafaaf5184e381b7bc5594ed/7ea6a61ea8d3fd1f2643ad5d274e251f95ca5f38.jpg'),
          ],
        );
      }
    
    image network.png

    4.4 加载带占位图的网络图片

    4.4.1 FadeInImage.assetNetwork 使用本地占位图加载图片

      ListView _listview(){
        return ListView(
          padding: const EdgeInsets.all(30),
          children: [
            Text("本地图片"),
            Container(
              height: 150,
              child: _localRow(),
            ),
            Text("网络图片"),
            Image.network('http://tiebapic.baidu.com/forum/w%3D580/sign=a96ca741eafaaf5184e381b7bc5594ed/7ea6a61ea8d3fd1f2643ad5d274e251f95ca5f38.jpg'),
            Text("带占位图的网络图片,成功加载"),
            FadeInImage.assetNetwork(
              placeholder: 'images/base_widgets/star_black.png',
              image: 'http://tiebapic.baidu.com/forum/w%3D580/sign=a96ca741eafaaf5184e381b7bc5594ed/7ea6a61ea8d3fd1f2643ad5d274e251f95ca5f38.jpg',
              fit: BoxFit.fill,
            ),
          ],
        );
      }
    
    
    image network asset success

    4.4.2 FadeInImage.memoryNetwork 使用第三方 package 加载透明占位图

    安装第三方 package,安装教程-第5项
    我们把第三方库换成如下所示transparent_image

    dev_dependencies:
      flutter_test:
        sdk: flutter
      transparent_image: ^1.0.0
    

    安装完成后

    import 'package:transparent_image/transparent_image.dart';
    
      ListView _listview(){
        return ListView(
          padding: const EdgeInsets.all(30),
          children: [
            Text("本地图片"),
            Container(
              height: 150,
              child: _localRow(),
            ),
            Text("网络图片"),
            Image.network('http://tiebapic.baidu.com/forum/w%3D580/sign=a96ca741eafaaf5184e381b7bc5594ed/7ea6a61ea8d3fd1f2643ad5d274e251f95ca5f38.jpg'),
            Text("带占位图的网络图片,成功加载"),
            FadeInImage.assetNetwork(
              placeholder: 'images/base_widgets/star_black.png',
              image: 'http://tiebapic.baidu.com/forum/w%3D580/sign=a96ca741eafaaf5184e381b7bc5594ed/7ea6a61ea8d3fd1f2643ad5d274e251f95ca5f38.jpg',
              fit: BoxFit.fill,
            ),
            FadeInImage.memoryNetwork(
              placeholder: kTransparentImage,
              image: 'http://tiebapic.baidu.com/forum/w%3D580/sign=a96ca741eafaaf5184e381b7bc5594ed/7ea6a61ea8d3fd1f2643ad5d274e251f95ca5f38.jpg',
            ),
          ],
        );
      }
    
    image network success.png

    4.4.3 网络图片加载失败

    我们把4.4.2中的网络图片的URL分别删除和给一个错误的URL,看一下效果。

      ListView _listview(){
        return ListView(
          padding: const EdgeInsets.all(30),
          children: [
            Text("本地图片"),
            Container(
              height: 150,
              child: _localRow(),
            ),
            Text("网络图片"),
            Image.network('http://tiebapic.baidu.com/forum/w%3D580/sign=a96ca741eafaaf5184e381b7bc5594ed/7ea6a61ea8d3fd1f2643ad5d274e251f95ca5f38.jpg'),
            Text("带占位图的网络图片,成功加载"),
            FadeInImage.assetNetwork(
              placeholder: 'images/base_widgets/star_black.png',
              image: 'http://tiebapic.baidu.com/forum/w%3D580/sign=a96ca741eafaaf5184e381b7bc5594ed/7ea6a61ea8d3fd1f2643ad5d274e251f95ca5f38.jpg',
              fit: BoxFit.fill,
            ),
            FadeInImage.memoryNetwork(
              placeholder: kTransparentImage,
              image: 'http://tiebapic.baidu.com/forum/w%3D580/sign=a96ca741eafaaf5184e381b7bc5594ed/7ea6a61ea8d3fd1f2643ad5d274e251f95ca5f38.jpg',
            ),
            Text("带占位图的网络图片,加载失败"),
            FadeInImage.assetNetwork(
              placeholder: 'images/base_widgets/star_black.png',
              image: '',
              fit: BoxFit.fill,
            ),
            FadeInImage.memoryNetwork(
              placeholder: kTransparentImage,
              image: 'http://tiebapic.baidu.com/forum/w%3D580/sign=a96ca741eafaaf5184e381b7bc5594ed/7ea6a61ea8d3fd1f2643ad5d274e251f95ca5f.jpg',
            ),
          ],
        );
      }
    
    image network failure.png

    5. 技术小结

    • Image 的导入以及引用。
    • Image 组件中使用本地图片。
    • Image 组件中使用网络图片。
    • Image 组件中使用占位图。

    相关文章

      网友评论

        本文标题:Flutter入门(9):Flutter 组件之 Image、A

        本文链接:https://www.haomeiwen.com/subject/jsodektx.html