代码编织梦想

想实现的效果
1、通过网络url加载图片(支持 gif)
2、加载之前使用默认占位图
3、加载出现问题后要做兜底处理

其实可以通过先将图片资源加载到本地文件中,然后读出来设置,虽然要绕一圈,但不失为一个好方案。

但是,为了熟悉 Flutter 的图片相关知识,还是采用官方提供的 API 来试着实现。

下面是最终方案

	FadeInImage(
        image: _addImageLoadListener(imageUrl),
        // TODO 未加载出来前的占位图
        placeholder: AssetImage("xxx/xxx.jpg"),
        fit: BoxFit.fill,
        imageErrorBuilder: (context, error, stackTrace) {
          // TODO 图片加载错误后展示的 widget
          // print("---图片加载错误---");
          // 此处不能 setState
          return AssetImage("xxx/xxx.jpg");
        },
    )
  ImageProvider _addImageLoadListener(String url) {
    Image image = Image.network(url);
    image.image
        .resolve(ImageConfiguration.empty)
        .addListener(ImageStreamListener((info, synchronousCall) {
          // 图片加载成功
          // print("---图片加载成功---${info.toString()}---${err.toString()}");
          // 要到图片加载出来才算展示
          // TODO gif 播放过程中会一直回调
          if (!_isShow) {
            setState(() {
              _isShow = true;
            });
          }
        }, onChunk: (event) {
          // 也可以这样
          /*if(event.cumulativeBytesLoaded/event.expectedTotalBytes>=1){
            _adEvent(1);
          }*/
        }, onError: (_, __) {
          setState(() {
            _isFail = true;
          });
        }));
    return image.image;
  }

虽然可通过下面的方式实现同样的效果,但是会遇到以下问题
1、errorBuilder 没有回调,刚开始 demo 时好像可以,后面一直不行,邪 ~
2、loadingBuilder 在加载网络图片过程中一直回调,通过 AS 的 flutter performance 检测工具,会发现加载过程中,相关 widget 一直在刷新。
3、frameBuilder,对于普通图片,只有一帧的,此方法只会回调两次,而对于 gif 图片,即使图片资源已加载完成,gif 图片播放过程中,此方法会一直回调,通过 AS 的 flutter performance 检测工具,会发现相关 widget 一直在刷新,除非移除这个 widget。

	Image.network(
          "xxx",
          frameBuilder: (context, child, frame, wasSynchronouslyLoaded){
            return child;
          },
          loadingBuilder: (context, child, loadingProgress){
            return child;
          },
          errorBuilder: (context, error, stackTrace){
            return Container();
          },
	)

有空再细致研读一下源码 ~

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/zeqiao/article/details/111122982

Flutter实现google登陆(gmail)-爱代码爱编程

参考资料Flutter Google Sign In 环境介绍插件平台AndroidIOS 环境介绍 系统:Windows 10 IDE:Android Studio 3.5.2 Flutter:1.22.2 Dart:2.8.4 Gradle:5.6.2 插件 google_sign_infirebase_au

Flutter运行App时出现“Running Gradle task ‘assembleDebug“问题解决-爱代码爱编程

Flutter开发过程中,最麻烦的就是环境搭建了,从写好代码到项目编译在模拟器中运行成功这个过程是十分曲折的。 下面介绍在运行APP时遇到如标题所示的问题如何解决: 出现这种问题的原因是因为Gradle的Maven仓库在国外, 因此需要使用国内的阿里云的镜像地址。 1. 修改项目名下android文件夹里的build.gradle文件,注释下图中的两

Dialog提示框 - flutter-爱代码爱编程

import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:bot_toast/bot_toast.dart'; import '../../components/MyDiglog.dart'; class Time ex

打开旧Flutter项目说:Your Flutter application is created using an older version of the Android embedding-爱代码爱编程

我的flutter SDK版本 :1.22.4   在打开旧的flutter项目时可能会遇到如下2个警告(FlutterSDK1.22.4创建的新项目不会存在这2个问题,所以用新项目和旧项目对比一下就容易找到修复问题的办法): 警告1、 Your Flutter application is created using an older versi

解决Flutter运行一直卡在 Running Gradle task ‘assembleDebug‘...-爱代码爱编程

  最近学习flutter开发,第一步就被拦住了。。。 创建项目点击运行后,Running Gradle task 'assembleDebug'...一直等一直等,,,都快哭了 解决: 首先找到fultter sdk所在文件夹的位置:依次进入  flutter\packages\flutter_tools\gradle  文件夹,然后打开flutt

iOS AOP 简介与作用-爱代码爱编程

  联系人:石虎 QQ:1224614774    昵称: 嗡嘛呢叭咪哄                       QQ群:807236138  群称: iOS 技术交流学习群                      QQ群:713799633   群称:iOS技术交流学习群-2 一、AOP概念 AOP全称(Aspect Oriente

JavaScript 中回调地狱的今生前世-爱代码爱编程

JavaScript 中回调 JavaScript 中回调地狱的今生前世异步编程异步实现回调promiseGeneratorawait/async JavaScript 中回调地狱的今生前世 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markd

回调与递归案例-爱代码爱编程

回调案例 红绿灯 var id; function setLight() { arguments[0](arguments[1], arguments[2]); } function redLight(fn, fn2) { //两个参数就是下次和下下次要执行的函数。 clearTimeout(id); cons

C、C++类实现的回调-爱代码爱编程

回调函数其实就是对函数指针的应用,要求用户按照相程序员规定的函数指针类型来世实现定义的函数。 1、第一种方式 c语言中实现回调 #include<iostream> #include<Windows.h> using namespace std; //用户不可见 int(*pc)(int a, int b); /* 由用户实

线程池(CompletableFuture)学习笔记(新手向纯干货)-爱代码爱编程

恭喜发现宝藏!微信搜索公众号【TechGuide】关注更多新鲜好文和互联网大厂的笔经面经。 作者@TechGuide【全网同名】 点赞再看,养成习惯,您动动手指对原创作者意义非凡🤝 当你的才华还撑不起你的野心时,你应该静下心去学习 。🤝点赞再看,养成习惯🤝前言 以下内容主要涉及线程池的使用,不涉及底层原理,比如阻塞队列,线程池底层实现等。另外

Hudi回调功能简介及使用示例-爱代码爱编程

1. 功能简介 从0.6.0版本开始,Hudi开始支持 commit 回调功能。每当Hudi成功提交一次 commit, 其内部的回调服务就会向外部系统发出一条回调信息。用户可以根据该回调信息查询hudi表的增量数据,并根据具体需求进行相应的业务处理。 1.1 支持的回调方式 当前 HoodieDeltaStreamer 可用过 HTTP(默认) 和

游戏服务器框架之跨服(三)-爱代码爱编程

跨服回调 回调设计是跨服基础的一个设计难点。类似于JavaScript的Ajax请求,我们希望在向跨服发送请求,拿到服务器的返回结果后能够执行一些回调动作。 如果使用Rpc框架,那么回调API看起来就是这样子的: public Message sendData(Message request) { } 不管请求方是否需要回调,都是需要通过请求方发