1. 程式人生 > >flutter原始碼學習筆記-圖片載入流程

flutter原始碼學習筆記-圖片載入流程

本文基於1.12.13+hotfix.8版本原始碼分析。 #### 0、大綱 1. Image 2. ImageProvider 3. 圖片資料載入 ImageStream、ImageStreamCompleter 4. 快取池 PaintingBinding#imageCache 5. 網路圖片載入 #### 1、Image 點選進入原始碼,可以看到Image繼承自StatefulWidget,那麼重點自然在State裡面。跟著生命週期走,可以發現在didUpdateWidget中呼叫了這個方法: ``` void _resolveImage() { // 在這裡獲取到一個流物件 final ImageStream newStream = widget.image.resolve(createLocalImageConfiguration( context, size: widget.width != null && widget.height != null ? Size(widget.width, widget.height) : null, )); assert(newStream != null); _updateSourceStream(newStream); } void _updateSourceStream(ImageStream newStream) { // ... 省略部分原始碼 if (_isListeningToStream) _imageStream.addListener(_getListener()); } ImageStreamListener _getListener([ImageLoadingBuilder loadingBuilder]) { loadingBuilder ??= widget.loadingBuilder; return ImageStreamListener( _handleImageFrame, onChunk: loadingBuilder == null ? null : _handleImageChunk, ); } ``` 在這裡呼叫了image(ImageProvider)的resolve方法獲取到一個ImageStream,並給這個流設定了監聽器。從名字上,不難猜出這是個圖片資料流,在listener拿到資料後會呼叫setState(() {})方法進行rebuild,這裡不再貼程式碼。 #### 2、ImageProvider 在上面我們看到了Image是需要接收圖片資料進行繪製的,那麼,這個資料是在哪裡解碼的?又是哪裡傳送過來的? 帶著疑問,我們先進到ImageProvider的原始碼,可以發現其實這個類非常簡單,程式碼量也不多,可以看看resolve方法的核心部分: ```