/* author: Jpeng email: peng8350@gmail.com time:2019-7-26 3:30 */ library flutter_gifimage; import 'dart:io'; import 'dart:ui' as ui show Codec; import 'dart:ui'; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; /// controll gif class GifController extends AnimationController{ GifController({ @required TickerProvider vsync, double value=0.0, Duration reverseDuration, Duration duration, AnimationBehavior animationBehavior }):super.unbounded( value:value, reverseDuration:reverseDuration, duration:duration, animationBehavior:animationBehavior??AnimationBehavior.normal, vsync:vsync); } class GifImage extends StatefulWidget{ GifImage({ @required this.image, @required this.controller, this.semanticLabel, this.excludeFromSemantics = false, this.width, this.height, this.onFetchCompleted, this.color, this.colorBlendMode, this.fit, this.alignment = Alignment.center, this.repeat = ImageRepeat.noRepeat, this.centerSlice, this.matchTextDirection = false, this.gaplessPlayback = false, }); final VoidCallback onFetchCompleted; final GifController controller; final ImageProvider image; final double width; final double height; final Color color; final BlendMode colorBlendMode; final BoxFit fit; final AlignmentGeometry alignment; final ImageRepeat repeat; final Rect centerSlice; final bool matchTextDirection; final bool gaplessPlayback; final String semanticLabel; final bool excludeFromSemantics; @override State createState() { return new GifImageState(); } } class GifImageState extends State{ List _infos; int _curIndex = 0; bool _fetchComplete= false; ImageInfo get _imageInfo { if(!_fetchComplete)return null; return _infos==null?null:_infos[_curIndex]; } static final HttpClient _sharedHttpClient = HttpClient()..autoUncompress = false; static HttpClient get _httpClient { HttpClient client = _sharedHttpClient; assert(() { if (debugNetworkImageHttpClientProvider != null) client = debugNetworkImageHttpClientProvider(); return true; }()); return client; } void _fetchImage() async{ ImageProvider provider = widget.image; dynamic data; if(provider is NetworkImage){ final Uri resolved = Uri.base.resolve(provider.url); final HttpClientRequest request = await _httpClient.getUrl(resolved); provider.headers?.forEach((String name, String value) { request.headers.add(name, value); }); final HttpClientResponse response = await request.close(); data = await consolidateHttpClientResponseBytes( response, ); } else if(provider is AssetImage){ AssetBundleImageKey key = await provider.obtainKey(ImageConfiguration()); data = await key.bundle.load(key.name); } else if(provider is FileImage){ data = await provider.file.readAsBytes(); } else if(provider is MemoryImage){ data = provider.bytes; } ui.Codec codec=await PaintingBinding.instance.instantiateImageCodec(data.buffer.asUint8List()); _infos = []; for(int i = 0;i