flutter在加載gif圖時,有時候會遇到加載的gif圖跟磕了藥一樣,播放的特別快;
使用ps打開,發現播放快的圖,幀與幀之間沒有設置間隔;至于為什么電腦上打開沒有問題,那是因為如果幀間隔為0,電腦上默認是0.1s;
但是flutter就不一樣了,他沒有設置默認間隔時間,也就是以0s播放的;查看image stream源碼發現,其實gif圖的播放是每幀之間通過延時xms進行播放,大多數手機刷新率是60,按理說應該是每秒60幀圖像,實際上flutter通過SchedulerBinding.instance.scheduleFrameCallback
去處理下一幀播放的;
修改方案:
既然Windows和macos上如果幀間隔為0,就默認0.1s播放,那我們也可以把flutter的默認幀間隔改為0.1s
修改代碼如下:
先找到flutter/packages/flutter/lib/src/painting/image_stream.dart
文件
在給_frameDuration
賦值時,判斷一下是否為0,如果是0就給個默認的100ms
void _handleAppFrame(Duration timestamp) {
_frameCallbackScheduled = false;
if (!hasListeners) {
return;
}
assert(_nextFrame != null);
if (_isFirstFrame() || _hasFrameDurationPassed(timestamp)) {
_emitFrame(ImageInfo(
image: _nextFrame!.image.clone(),
scale: _scale,
debugLabel: debugLabel,
));
_shownTimestamp = timestamp;
_frameDuration = _nextFrame!.duration;
///修改這里
if(_frameDuration?.inMilliseconds == 0){
_frameDuration = Duration(milliseconds: 100);
}
_nextFrame!.image.dispose();
_nextFrame = null;
final int completedCycles = _framesEmitted ~/ _codec!.frameCount;
if (_codec!.repetitionCount == -1 || completedCycles <= _codec!.repetitionCount) {
_decodeNextFrameAndSchedule();
}
return;
}
final Duration delay = _frameDuration! - (timestamp - _shownTimestamp);
_timer = Timer(delay * timeDilation, () {
_scheduleAppFrame();
});
}
同樣如果用到了cached_network_image插件
找到multi_image_stream_completer.dart文件,同樣是修改_handleAppFrame方法