flutter 加载图片和文件

226 阅读3分钟

加载图片的两个widget:Image.network() ,Image.asset()

Image.network() 用于加载网络图片,

Image.network()的使用

Image.network(
    String src,  // 图片地址
  {
    super.key,
    double scale = 1.0, // 缩放
    this.frameBuilder, 
    this.loadingBuilder,
    this.errorBuilder,
    this.semanticLabel,
    this.excludeFromSemantics = false,
    this.width, // 宽度
    this.height, // 高度
    this.color, // 背景色
    this.opacity, // 透明度
    this.colorBlendMode, // 颜色混合
    this.fit, // 图片适应
    this.alignment = Alignment.center, //对齐方式
    this.repeat = ImageRepeat.noRepeat, // 图片重复展示
    this.centerSlice,
    this.matchTextDirection = false,
    this.gaplessPlayback = false,
    this.filterQuality = FilterQuality.low,
    this.isAntiAlias = false,
    Map<String, String>? headers,
    int? cacheWidth,
    int? cacheHeight,
  }) 

实例

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        width: 200,
        height: 200,
        margin: EdgeInsets.fromLTRB(0, 40, 0, 40),
        decoration:  BoxDecoration(
          color: Colors.orange,
        ),
        // 添加一个网络图片Widget,图片fit为cover,宽度200,高度200
        child: Image.network("https://img0.baidu.com/it/u=823872589,3855820635&fm=253",
          fit: BoxFit.cover,
          width: 200,
          height: 200,),
      )
    );
  }
}

Image.asset()用于加载本地图片

加载本地图片需要三步

1. 添加一个文件夹images 到根目录,然后在images文件下添加2.0x文件和3.0文件,

1669774753187(1).png

2. 需要到pubspec.yaml文件下,添加图片路径

1669774965903(1).png

3. 使用Image.asset(),这里需要注意添加完图片后,需要进行重启项目才能找到图片。

class CricleHeader extends StatelessWidget {
  const CricleHeader({super.key});

  @override
  Widget build(BuildContext context) {
    return ClipOval(
      // backgroundImage: Image.asset(""),
      child: Image.asset('images/a.jpeg',fit: BoxFit.cover,width: 200,height: 200,),
    );
  }
}

加载文件

以加载本地的json文件为例,加载本地的json文件和加载本地的图片差不多。

1. 添加一个文件夹assets 到根目录,然后在assets文件下添加json文件夹,文件夹下有title_list.json文件。

1681284378764.png

json文件中的内容。

{
  "artical": [
    {
      "title":"都2023年了,你还不懂这是啥",
      "auto":"哇蓝蓝",
      "time":"1天前",
      "desc":"在前端大环境如此不好的情况下,你有什么打算考虑一下。",
      "type":"前端"
    },
    {
      "title":"php如何快速搭建一个博客,这么做节省一年的时间,快来试试吧",
      "auto":"天其不错哦",
      "time":"1月前",
      "desc":"作为一个php的小码农,你不想拥有一个简单的博客系统吗?进可攻,退可守",
      "type":"后端"
    },
    {
      "title":"flutter新的适配移动端的方案,跨平台的解决方案,最优还是一般,看看大佬的看法吧",
      "auto":"有些人",
      "time":"3天前",
      "desc":"flutter新的适配移动端的方案,跨平台的解决方案,最优还是一般,看看大佬的看法吧",
      "type":"移动端"
    }
  ]
}

2. 需要根据json文件的内容来创建对应的class。

可以自己手写,当然也可以第三方生成。这里我使用app.quicktype.io/ 这个网站来生成类。切记生成的类需要检查一下,有时会有错误出现的。

这里简单看一下生成的代码,看下面两行的代码。

// 这个函数,传入一个json字符串生成对应的类出来,json.decode(str),将json字符串转为map对象
ArticalData articalDataFromJson(String str) => ArticalData.fromJson(json.decode(str));

// 传入类,生成对应的json
String articalDataToJson(ArticalData data) => json.encode(data.toJson());

1681284727554.png

3. 加载json文件

需要想加载本地图片一下,先在pubspec.yaml文件下,添加文件路径,这里我们只写到了json/ 的路径,这里会找到对应文件夹下的所有文件。

1681284905336.png

使用异步加载函数rootBundle.loadString(String key, {bool cache = true}),来加载json文件,加载完成会返回一个字符串出来。

Future getlist() async {
    // 异步加载json文件 
    String jsonstings = await rootBundle.loadString("assets/json/title_list.json");
    
    // 调用上面生成的方法,传入回去到的字符串
    ArticalData articaldata = articalDataFromJson(jsonstings);
    
    // 返回生成的类 
    return articaldata.artical;
  } 

至此加载本地的json文件就完成了。