Flutter的本机支持显示组件上的网络图片。最简单的使用方法是如下。呼叫的构造函数可以实现网络图片的下载显示。
那么它如何在内部实现?是否有任何缓存处理或其他优化操作?有疑问,让我们看一下如何实现其底层。
我们以最简单的调用为例。当我们使用此方法显示图片时,将分配组件内的属性。
这是一个类呼叫,这是一个专门用于下载和分析网络图片逻辑的子类。当然,您直接点击的内容实际上是一个抽象类,而不是真正实现下载逻辑的地方,而是真正的网络图片下载和分析在此文件下的实现。构造函数知道它们已经足够了。接下来,这取决于何时触发网络图片的下载。
它是一个,它对应于相应的名称。在这个生命周期中,控制图片的下载过程。
国家的生命周期可以简单地分为:
因此,我们遵循此订单,并迅速看到一个可疑的地方,方法是用于控制动画,此处用于确定动画是否被禁用。进行相关的简介,您可以阅读本文
我们输入该方法。
有三件事。
1.包装
2.创建图片流对象
3.更新图片流
它也是一个子类。它的效果非常简单,即防止在快速滑动过程中加载图片。当有快速的幻灯片时,将在下一个框架中放置图片的作品。
该方法创建的图片的基本配置信息保留了,例如屏幕项目比率,本地化,大小,平台等。
表达图片流,您可以添加一个观察者来监视是否处理图片。一个图片流可以添加多个观察者。
通过方法调用后创建。从这里的对象是对象的源代码可以看到它。
以下代码从ImageProvider拦截并剪切了无关的代码。
该方法的作用是创建图片流对象并根据传输图片配置信息配置信息。
因此,如何创建它,我们输入了检查方法。关键代码如下,并且已删除了无关的代码。
您可以在该方法中看到调用的方法,并且该方法未详细实现,并且子类需要完成相应的实现。
记住上述分析。我们说该条目的实例是一个对象,因此必须在此类中找到相应的实现。它被包装了。
然后我们去找到它。
请注意,实际实施在文档下。
在这一点上,我们知道。
获得键后的下一步是回调方法。这将触发下一个过程。
仍然回到子类,它重写了父类方法。如前所述,它用于防止列表快速滑动时加载图片。那么它如何意识到它?我们将从这种方法中找到答案。
对于滑动组件,它具有一种方法,该方法是建议延迟加载。内部比较最终基于滑动速度的侧面和当前设备的最大物理大小。如果大于大,则意味着速度太快,建议延迟。特定的逻辑在文件下。在这里不多引入。
一旦当前的应用程序滑动并且速度太快,则图片的加载将被推迟到下一个帧进行尝试。因此,我们说,当它快速滑动时,就无法加载图片。
当可以加载判断时,操作流将移交给包装类,即处理它。
首次加载网络图时,它将直接进入下面的逻辑。此处涉及一个非常重要的类。它用于图片的缓存。
图片缓存类,只有内存缓存。它是通过绘画绑定的,是单一的利润。它通过三张地图缓存了图片。
将图片的逻辑从图片缓存到方法。以下代码删除了无关的代码。
一旦找不到缓存图片,您将返回并进行真实的下载过程。
仍然首先查看类别,该方法已在其中实现,并将其传递给实现。
在底部,您可以找到实现的相应方法。有一种下载我们要寻找的核心代码的方法。
经过大量的圈速后,我终于来到了下载图片的地方。您可以看到下载图片的逻辑非常简单。创建下载的HTTP请求,设置标题并下载图片。一旦下载成功,图片的二进制数据将通过Decode的回调返回。
这些返回的二进制数据是在中间处理的。是的,子类用于管理多帧图片的加载。
在建设性方法中,我们可以看到它以进行恢复。该编解码器是前面提到的异步方法。
判断该方法中是否有观察者的方法,如果有任何观察者,请输入解码过程。
该方法可以视为图片的解码方法。当然,实际的解码地点位于本地的底层。图片解码后,信息将保存在中间并保持它。在这里,我们只考虑单帧图片,并且不考虑GIF图片。解码。信息被封装在其中,这是真实的图片数据。并调用以更新图片信息的方法。该方法主要是为了告知观察者更新。我们可以查看该方法。
通过通知更新,刷新接口显示。
说到这,我们似乎没有提到观察到的观察者。好吧,我们再次返回原始入口和组件方法。
通过方法添加该观察者。
并且在创建观察者时,请设置回调。
设置了参数,因此在下载图片后调用该方法。
在这一点上,下载和更新图片的过程已被串起。下载的图片存储在中间,后来,它将设置为组件以实现渲染。
网络图片的加载逻辑可以分为以下步骤:
1.根据图片类型,生成相应的密钥
2.根据键在整体ImageCache下找到图片缓存,然后返回刷新
3.图片缓存未达到,请致电HTTP下载图片
4.下载图片后,将图片的二进制数据转回以触发接口刷新,同时,它将执行内存缓存
5.在生映射中显示网络图片
原始:https://juejin.cn/post/7100124055939842055