Giter VIP home page Giter VIP logo

fluttercandies / extended_image Goto Github PK

View Code? Open in Web Editor NEW
1.9K 1.9K 499.0 11.01 MB

A powerful official extension library of image, which support placeholder(loading)/ failed state, cache network, zoom pan image, photo view, slide out page, editor(crop,rotate,flip), paint custom etc.

Home Page: https://fluttercandies.github.io/extended_image/

License: MIT License

Objective-C 0.01% Dart 99.75% Kotlin 0.01% JavaScript 0.03% Swift 0.04% HTML 0.10% Ruby 0.08%
cache crop flip flutter image rotate zoom

extended_image's Introduction

extended_image's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

extended_image's Issues

can't be assigned to the parameter type 'ImageStreamListener

. Dart VM version: 2.3.1
. Flutter 1.7.2-pre.30 • channel master

..../extended_image-0.4.1/lib/src/extended_imag
e.dart:723:59: Error: The argument type 'void Function(ImageInfo, bool)' can't be assigned to the
parameter type 'ImageStreamListener'.

图片加载时 loading 样式 可否自定义

switch (_loadState) {
case LoadState.loading:
current = Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Center(
child: _getIndicator(context),
) ,
SizedBox(
width: 5.0,
),
Text("loading...")
],
);
break;

你的源码是这样,假如我图片预览背景是黑色的,那么 “loading。。。”这几个字显示不出来,就只能看到CupertinoActivityIndicator 骗左,建议 loading样式可从外部传进去一个widget

ExtenedImage Asset Provider

Hello, Thanks for the great library. However, I would like to know is there any way I can have AssetProvider using this library?

Right now I am using native AssetProvider but it seems it doesn't cache image.

 decoration: BoxDecoration(
          boxShadow: [
            BoxShadow(
                color: Colors.black12,
                offset: Offset(0.0, 3.0),
                blurRadius: 10.0)
          ],
          borderRadius: BorderRadius.circular(10),
        image:  DecorationImage(
          image: new AssetImage('images/room.jpg'),
          fit: BoxFit.fill,
        ),
      ),

Base64 image

How can I achieve Base64 image decoding and caching using extended image lib?.

initGestureConfigHandler居中问题

当initialScale大于1的时候,图片显示的不是中间的rect

ExtendedImage.network(
        url,
        mode: ExtendedImageMode.gesture,
        initGestureConfigHandler: (state) {
          return GestureConfig(
            minScale: 1.0,
            animationMinScale: 1.0,
            maxScale: maxScale,
            animationMaxScale: maxScale,
            speed: 1.0,
            inertialSpeed: 100.0,
            initialScale: maxScale,
          );
        },
        fit: BoxFit.contain,
        width: MediaQuery.of(context).size.width,
        height: MediaQuery.of(context).size.height,
      )

自定义failed的时候,点击事件无法获取

            if (_state.extendedImageLoadState == LoadState.failed) {
              return Container(
                alignment: Alignment.center,
                child: GestureDetector(
                  onTap: () {
                    _state.reLoadImage();
                  },
                  child: EmptyView(
                    fontSize: 18,
                  ),
                ),
              );
            }

不知道是不是姿势不对,不走ontap

swipe back image preview page made background to black

Hi, the default swipe back image preview page is white and not good at previewing images. Also the swip gesture senstive seems not as good as wechat (need fully drag to the bottom of the page can trigger the back function).

BoxShape.circle is not working as expected.

Hello there,
I am trying to add a circle image view with my sized box, It creates a sort of oval shape and not a perfect circle. However if I apply a border to image it draws a perfect circle but image still goes out of border.

Note : showCricleImage is true at this time.
Snippet from my AppImageLoader class which renders image for me with Extended Image lib.

Widget loadAssetImage() {
    return ExtendedImage.asset(
      widget.imageUrl,
      borderRadius: widget.showCircleImage == null || !widget.showCircleImage
          ? BorderRadius.circular(5)
          : BorderRadius.circular(0),
      shape: widget.showCircleImage != null && widget.showCircleImage
          ? BoxShape.circle
          : BoxShape.rectangle,
      enableMemoryCache: true,
      clearMemoryCacheIfFailed: true,
      loadStateChanged: (ExtendedImageState state) {
        switch (state.extendedImageLoadState) {
          case LoadState.loading:
            {
              return Container(
                color: AppColors.overlay_card_color,
              );
            }
          case LoadState.completed:
            {
              return ExtendedRawImage(
                fit: BoxFit.cover,
                image: state.extendedImageInfo?.image,
              );
            }
          case LoadState.failed:
            {
              return Container(
                color: AppColors.overlay_card_color,
              );
            }
          default:
            {
              return Container(
                color: AppColors.overlay_card_color,
              );
            }
        }
      },
    );
  }
SizedBox.fromSize(
        size: Size(80,80),
        child: AppImageLoader.withImage(
          imageUrl: imageUrl,
          imageType: type,
          showCircleImage: true,
        ),
      ),

Screenshot 2019-09-23 at 4 59 43 PM

希望提供获取本地缓存图片路径的方法

有一个这样的使用场景,混合开发需要互相传递image video 时,直接传本地路径就好了,传网络路径的话,还要重新下载缓存,如果能共用路径,实际上就相当于共用缓存了。

Wrong in handling picture swiper's gesture.

When one of the pictures' scale greater than 1.0, swipe on the left or right edge of this picture, as expected swiper will switch to next or previous picture. But at this time if user drag reverse direction, the picture which has been scaled will be scrolled, and the pageview stuck.

Expectaion: The picture which has been scaled won't be scrolled when swiping.

当图片序列中有一张图片的缩放>1,从此图片的左右进行拖动切换图片,设计中将正常切换到下一张或上一张图片,但当手势反向时,该图片将被拖动,pageview卡在原位。

期望:被缩放的图片滑动切换时不被拖动。

androidx support?

projects with Android X support will not built with it. seems imagepickersave has Android X
support issue.

how to set badCertificateCallback

加载不出来https的图片,证书不被信任,这改怎么解决?
有没有入口给client设置badCertificateCallback 参数

最新 flutter master分支

MultiFrameImageStreamCompleter的informationCollector类变了

image
image

Compiler message:
file:///C:/Users/10324/AppData/Roaming/Pub/Cache/hosted/pub.flutter-io.cn/extended_image_library-0.1.0/lib/src/extended_network_image_provider.dart:65:31: Error: The argument type 'Null Function(StringBuffer)' can't be assigned to the parameter type 'Iterable<DiagnosticsNode> Function()'.
 - 'StringBuffer' is from 'dart:core'.
 - 'Iterable' is from 'dart:core'.
 - 'DiagnosticsNode' is from 'package:flutter/src/foundation/diagnostics.dart' ('file:///D:/environment/flutter/packages/flutter/lib/src/foundation/diagnostics.dart').
Try changing the type of the parameter, or casting the argument to 'Iterable<DiagnosticsNode> Function()'.
        informationCollector: (StringBuffer information) {
                              ^
Compiler failed on D:\code\flutter\projects\hobby\lib\main.dart
Finished with error: Gradle task assembleDebug failed with exit code 1

While zooming if I try to set loading state, zoom gesture won't work.

@zmtzawqlp back to the place holder again. while zooming if I try to set loading state, zoom gesture won't work.

 child: ExtendedImage.network(
              widget.photo.photoUrl,
              width: Appconstants.deviceWidth,
              height: Appconstants.deviceHeight,
              enableLoadState: true,
              loadStateChanged: (ExtendedImageState state){
                switch (state.extendedImageLoadState) {
                  case LoadState.loading:
                    return Icon(Icons.photo, color: Colors.teal.shade100,);

                    break;
                  case LoadState.completed:
                    var widget=ExtendedRawImage(
                      image: state.extendedImageInfo?.image,
                      fit: BoxFit.cover,
                    );
                    return widget;
                    break;
                  case LoadState.failed:
                    return Icon(Icons.photo, color: Colors.teal.shade100,);

                    break;
                }
              },
              clearMemoryCacheIfFailed: true,
              alignment: Alignment.center,
              mode: ExtendedImageMode.Gesture,
              initGestureConfigHandler: (state) {
                return GestureConfig(
                    minScale: 1.0,
                    animationMinScale: 0.7,
                    maxScale: 5.0,
                    animationMaxScale: 5.5,
                    speed: 1.0,
                    inertialSpeed: 100.0,
                    initialScale: 1.1,
                    inPageView: false);
              },
            ),

Originally posted by @ManojMM026 in #4 (comment)

不能用

photo view 报错
Compiler message:
file:///D:/flutter/.pub-cache/hosted/pub.flutter-io.cn/extended_image_library-0.1.5/lib/src/extended_network_image_provider.dart:68:29: Error: The argument type 'List Function()' can't be assigned to the parameter type 'void Function(StringBuffer)'.

  • 'List' is from 'dart:core'.
  • 'DiagnosticsNode' is from 'package:flutter/src/foundation/diagnostics.dart' ('file:///D:/flutter/packages/flutter/lib/src/foundation/diagnostics.dart').
  • 'StringBuffer' is from 'dart:core'.
    Try changing the type of the parameter, or casting the argument to 'void Function(StringBuffer)'.
    informationCollector: () {
    ^
    file:///D:/flutter/.pub-cache/hosted/pub.flutter-io.cn/extended_image-0.5.7/lib/src/editor/extended_image_editor_utils.dart:223:25: Error: Method not found: 'Rect.fromCenter'.
    rect = Rect.fromCenter(
    ^^^^^^^^^^
    file:///D:/flutter/.pub-cache/hosted/pub.flutter-io.cn/extended_image-0.5.7/lib/src/editor/extended_image_editor_utils.dart:230:25: Error: Method not found: 'Rect.fromCenter'.
    rect = Rect.fromCenter(
    ^^^^^^^^^^
    file:///D:/flutter/.pub-cache/hosted/pub.flutter-io.cn/extended_image-0.5.7/lib/src/extended_image.dart:765:11: Error: Method not found: 'ImageStreamListener'.
    ImageStreamListener(_handleImageChanged, onError: _loadFailed));
    ^^^^^^^^^^^^^^^^^^^
    file:///D:/flutter/.pub-cache/hosted/pub.flutter-io.cn/extended_image-0.5.7/lib/src/extended_image.dart:777:11: Error: Method not found: 'ImageStreamListener'.
    ImageStreamListener(_handleImageChanged, onError: _loadFailed));
    ^^^^^^^^^^^^^^^^^^^
    file:///D:/flutter/.pub-cache/hosted/pub.flutter-io.cn/extended_image-0.5.7/lib/src/extended_image.dart:765:11: Error: The method 'ImageStreamListener' isn't defined for the class '_ExtendedImageState'.
  • '_ExtendedImageState' is from 'package:extended_image/src/extended_image.dart' ('file:///D:/flutter/.pub-cache/hosted/pub.flutter-io.cn/extended_image-0.5.7/lib/src/extended_image.dart').
    Try correcting the name to the name of an existing method, or defining a method named 'ImageStreamListener'.
    ImageStreamListener(_handleImageChanged, onError: _loadFailed));
    ^^^^^^^^^^^^^^^^^^^
    file:///D:/flutter/.pub-cache/hosted/pub.flutter-io.cn/extended_image-0.5.7/lib/src/extended_image.dart:777:11: Error: The method 'ImageStreamListener' isn't defined for the class '_ExtendedImageState'.
  • '_ExtendedImageState' is from 'package:extended_image/src/extended_image.dart' ('file:///D:/flutter/.pub-cache/hosted/pub.flutter-io.cn/extended_image-0.5.7/lib/src/extended_image.dart').
    Try correcting the name to the name of an existing method, or defining a method named 'ImageStreamListener'.
    ImageStreamListener(_handleImageChanged, onError: _loadFailed));
    ^^^^^^^^^^^^^^^^^^^
    file:///D:/flutter/.pub-cache/hosted/pub.flutter-io.cn/extended_image-0.5.7/lib/src/extended_image.dart:783:9: Error: Method not found: 'ImageStreamListener'.
    ImageStreamListener(_handleImageChanged, onError: _loadFailed));
    ^^^^^^^^^^^^^^^^^^^
    file:///D:/flutter/.pub-cache/hosted/pub.flutter-io.cn/extended_image-0.5.7/lib/src/extended_image.dart:783:9: Error: The method 'ImageStreamListener' isn't defined for the class '_ExtendedImageState'.
  • '_ExtendedImageState' is from 'package:extended_image/src/extended_image.dart' ('file:///D:/flutter/.pub-cache/hosted/pub.flutter-io.cn/extended_image-0.5.7/lib/src/extended_image.dart').
    Try correcting the name to the name of an existing method, or defining a method named 'ImageStreamListener'.
    ImageStreamListener(_handleImageChanged, onError: _loadFailed));
    ^^^^^^^^^^^^^^^^^^^
    file:///D:/flutter/.pub-cache/hosted/pub.flutter-io.cn/extended_image-0.5.7/lib/src/extended_image.dart:790:9: Error: Method not found: 'ImageStreamListener'.
    ImageStreamListener(_handleImageChanged, onError: _loadFailed));
    ^^^^^^^^^^^^^^^^^^^
    file:///D:/flutter/.pub-cache/hosted/pub.flutter-io.cn/extended_image-0.5.7/lib/src/extended_image.dart:790:9: Error: The method 'ImageStreamListener' isn't defined for the class '_ExtendedImageState'.
  • '_ExtendedImageState' is from 'package:extended_image/src/extended_image.dart' ('file:///D:/flutter/.pub-cache/hosted/pub.flutter-io.cn/extended_image-0.5.7/lib/src/extended_image.dart').
    Try correcting the name to the name of an existing method, or defining a method named 'ImageStreamListener'.
    ImageStreamListener(_handleImageChanged, onError: _loadFailed));
    ^^^^^^^^^^^^^^^^^^^
    file:///D:/flutter/.pub-cache/hosted/pub.flutter-io.cn/extended_image-0.5.7/lib/src/editor/extended_image_editor.dart:145:37: Error: Method not found: 'Rect.fromCenter'.
    cropRect = Rect.fromCenter(
    ^^^^^^^^^^
    file:///D:/flutter/.pub-cache/hosted/pub.flutter-io.cn/extended_image-0.5.7/lib/src/editor/extended_image_crop_layer.dart:503:45: Error: Method not found: 'Rect.fromCenter'.
    var newScreenDestinationRect = Rect.fromCenter(

Flutter 1.7 error

Compiler message:
file:///Users/webwerks/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/extended_image-0.5.1/lib/src/extended_image.dart:733:59: Error: The argument type 'void Function(ImageInfo, bool)' can't be assigned to the parameter type 'ImageStreamListener'.

  • 'ImageInfo' is from 'package:flutter/src/painting/image_stream.dart' ('file:///Users/webwerks/Desktop/flutter/packages/flutter/lib/src/painting/image_stream.dart').
  • 'ImageStreamListener' is from 'package:flutter/src/painting/image_stream.dart' ('file:///Users/webwerks/Desktop/flutter/packages/flutter/lib/src/painting/image_stream.dart').
    Try changing the type of the parameter, or casting the argument to 'ImageStreamListener'.
    if (_isListeningToStream) _imageStream.removeListener(_handleImageChanged);

两个小问题

  1. loading样式能不能自定义

  2. 图片loading的时候出现了样式溢出

image

[Error] FadeTransition and loadStateChanged while changing page will cause an error

Hi,
I found a problem when using FadeTransition. When the animation controller still playing and move to another page, it will cause an error (see Logs). My suggestion is to wrap all setState in extended_image.dart with if(mounted) { setState(); }.
Thank you.

Code

case LoadState.completed: 
   _controller.forward();
   return FadeTransition(
              opacity: _controller,
              child: ExtendedRawImage(
                image: state.extendedImageInfo?.image,
                width: someWidth,
                height: someHeight,
              ),
            )

Logs

════════ Exception Caught By image resource service ════════════════════════════════════════════════
The following assertion was thrown when reporting an error to an image listener:
setState() called after dispose(): _ExtendedImageState#37bb5(lifecycle state: defunct, not mounted, stream: ImageStream#ae287(MultiFrameImageStreamCompleter#765d0, [512×512] @ 1.0x, 2 listeners), pixels: null)

This error happens if you call setState() on a State object for a widget that no longer appears in the widget tree (e.g., whose parent widget no longer includes the widget in its build). This error can occur when code calls setState() from a timer or an animation callback.

The preferred solution is to cancel the timer or stop listening to the animation in the dispose() callback. Another solution is to check the "mounted" property of this object before calling setState() to ensure the object is still in the tree.
This error might indicate a memory leak if setState() is being called because another object is retaining a reference to this State object after it has been removed from the tree. To avoid memory leaks, consider breaking the reference to this object during dispose().

When the exception was thrown, this was the stack: 
#0      State.setState.<anonymous closure> (package:flutter/src/widgets/framework.dart:1105:9)
#1      State.setState (package:flutter/src/widgets/framework.dart:1140:6)
#2      _ExtendedImageState._loadFailed (package:extended_image/src/extended_image.dart:698:5)
#3      ImageStreamCompleter.reportError (package:flutter/src/painting/image_stream.dart:474:24)
#4      ImageStreamCompleter.setImage (package:flutter/src/painting/image_stream.dart:409:9)
...
════════════════════════════════════════════════════════════════════════════════════════════════════

How do I zoom in on an image with double tap of 1 finger instead of needing 2? How do I get a sliding image to navigator pop back when it slides off the page?

Hi guys,

I have asked a question on stackoverflow and I was wondering if you would like to comment on it there if you have the time.

fluttercandies extended_image. How do I zoom in on an image with double tap of 1 finger instead of needing 2? How do I get a sliding image to navigator pop back when it slides off the page?

Trying to implement a zoom/pan image with double tap by 1 finger instead of the need for 2 to expand zoom an image. Have two issues with this code and was wondering if anyone has any ideas. The class is very simple with just 2 strings: image & title passed into it.

1, I need the image to expand on double tap. I would like the user to have to power to expand the image with one finger and not two. Think I need to put this code near the very end.
The good thing is that once it is expanded the double tap works to reduce the image size. How do I get it to do the opposite when it is at normal size?

2, the sliding of the image off the page results in a black screen. Thankfully, this doesn’t freeze or crash the app but it leaves the user with a blank screen and the need to press the system back button. I would like the slide to result in a navigator pop back to the original screen.

Firstly, here’s a sample code of how I’m passing an image and a title into expandimage.dart.

FlatButton(
            child: Image.asset(_kAsset5),
            onPressed: () async {
              Navigator.push(
                context,
                MaterialPageRoute(
                    builder: (context) => ExpandImage(
                          image: _kAsset5,
                          title: "green terminal",
                        )),
              );
            },
          ),

Here’s the code that I’m using for this ‘expandimage.dart’ and a lot of it is based on the pan/zoom example from flutter candies / extended image example.

import 'package:flutter/material.dart';
import 'package:extended_image/extended_image.dart';

class ExpandImage extends StatelessWidget {
  final String image, title;

  ExpandImage({this.image, this.title});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        backgroundColor: Colors.red[900],
        appBar: AppBar(
          backgroundColor: Colors.red[900],
          leading: IconButton(
            icon: Icon(Icons.close),
            onPressed: Navigator.of(context).pop,
          ),
          title: Text(
            title,
            style: TextStyle(
              color: Colors.yellow,
              inherit: true,
              fontWeight: FontWeight.w300,
              fontStyle: FontStyle.italic,
              letterSpacing: 2.0, //1.2
            ),
          ),
          centerTitle: true,
        ),
        body: SizedBox.expand(
          // child: Hero(
          // tag: heroTag,
          child: ExtendedImageSlidePage(
            slideAxis: SlideAxis.both,
            slideType: SlideType.onlyImage,
            child: ExtendedImage(
              //disable to stop image sliding off page && entering dead end without back button.
	      //setting to false means it won't slide at all.
              enableSlideOutPage: true,
              mode: ExtendedImageMode.gesture,
              initGestureConfigHandler: (state) => GestureConfig(
                minScale: 1.0,
                animationMinScale: 0.8,
                maxScale: 3.0,
                animationMaxScale: 3.5,
                speed: 1.0,
                inertialSpeed: 100.0,
                initialScale: 1.0,
                inPageView: false,
              ),
              // onDoubleTap: ?  zoom in on image
              fit: BoxFit.scaleDown,
              image: AssetImage(
                image,
              ),
            ),
          ),
        ),
      ),
    );
  }
}

大图缩放消失

放大一张高清图时会发生黑屏。 一开始可以正常放大, 放大到大约1.2倍之后就会黑屏, 缩放比例恢复后又会恢复显示。
复现步骤:
将demo中的图片路径换成附件的图片, 然后放大。
图片:
high_resolution

多张图片双击启用动画放大滑动下一张后再双击抛异常

复现步骤:
1、进入ExtendedImageGesturePageView 默认打开第一张图initialPage=0。双击缩放,再双击缩小,无问题。
2、滑动到下一页 initialPage=1,双击缩放,抛弃常。
3、如果 itemBuilder: (context, position) { 不返回 ExtendedImage.asset 而直接使用原生 Image 动画正常,不抛弃常。

AnimationController.stop() called after AnimationController.dispose()
flutter: When the exception was thrown, this was the stack:
flutter: #2      AnimationController.stop (package:flutter/src/animation/animation_controller.dart:698:7)
flutter: #3      GestureAnimation.stop (package:extended_image/src/gesture/extended_image_gesture_utils.dart:369:24)
flutter: #4      _ExtendedImageGestureState._handleScaleStart (package:extended_image/src/gesture/extended_image_gesture.dart:77:23)
flutter: #5      _ExtendedImageGestureState.handleDoubleTap (package:extended_image/src/gesture/extended_image_gesture.dart:247:5)
flutter: #6      _My.build.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:testapp/my.dart:72:27)

完整代码:

import 'package:flutter/material.dart';
import 'package:extended_image/extended_image.dart';


class My extends StatefulWidget {

  @override
  _My createState() => _My();
}

class _My extends State<My> with SingleTickerProviderStateMixin {
  AnimationController _animationController;
  Animation<double> _animation;

  @override
  void initState() {
    super.initState();
    _animationController = AnimationController(duration: Duration(milliseconds: 100), vsync: this);
  }

  @override
  void dispose() {
    _animationController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    List<String> files = ["a.jpg", "b.jpg", 'c.jpg'];
    PageController pageController = PageController();

    return ExtendedImageGesturePageView.builder(
        controller: pageController,
        onPageChanged: (int index){
          print('onPageChanged');
        },
        itemCount: 3,
        itemBuilder: (context, position) {
          var file = files[position];
          return Container(
              child: ExtendedImage.asset(
              "assets/images/$file",
              fit: BoxFit.contain,
              //enableLoadState: false,
              mode: ExtendedImageMode.Gesture,
              gestureConfig: GestureConfig(
                  minScale: 0.9,
                  animationMinScale: 0.7,
                  maxScale: 3.0,
                  animationMaxScale: 3.5,
                  speed: 1.0,
                  inertialSpeed: 100.0,
                  initialScale: 1.0,
                  inPageView: true
              ),
              onDoubleTap: (ExtendedImageGestureState state) {
                double begin = 0.0;
                double end = 0.0;
                if (state.gestureDetails.totalScale == 1.0) {
                  begin = 1.0;
                  end = 2.0;
                } else {
                  begin = state.gestureDetails.totalScale;
                  end = 1.0;
                }

                // PageView: Another exception was thrown: AnimationController.stop() called after AnimationController.dispose()
                try {
                  _animationController.reset();
                  _animation = Tween<double>(begin: begin, end: end).animate(_animationController);
                  _animation.addListener((){
                    state.handleDoubleTap(scale: _animation.value, doubleTapPosition: state.pointerDownPosition);
                  });
                  _animationController.forward();
                }catch(e){
                  print('xxxx');
                }
              }
            )
          );
        });
  }

}

滑动退出时的几个建议

在滑动退出时,能否搞一个自定义的滑动边界参数(也就是滑动退出时如果offset的到达这个自定义的临界offset,那就判定为退出的参数),因为我感觉和手机qq的图片预览相比,您的这个滑动退出的判定貌似比较吃力,要把手指移到稍微下面一点的地方才能判定为退出,手机qq是手指往下一扫就退出了,比较轻松,所以看看能不能稍微优化一下捏😂,还有我遇到一个问题就是在滑动退出的最后一瞬间图片还留在屏幕上,然后突然闪没了,这个能设置么?

最新 flutter master分支

MultiFrameImageStreamCompleter的informationCollector类变了

image
image

Compiler message:
file:///C:/Users/10324/AppData/Roaming/Pub/Cache/hosted/pub.flutter-io.cn/extended_image_library-0.1.0/lib/src/extended_network_image_provider.dart:65:31: Error: The argument type 'Null Function(StringBuffer)' can't be assigned to the parameter type 'Iterable<DiagnosticsNode> Function()'.
 - 'StringBuffer' is from 'dart:core'.
 - 'Iterable' is from 'dart:core'.
 - 'DiagnosticsNode' is from 'package:flutter/src/foundation/diagnostics.dart' ('file:///D:/environment/flutter/packages/flutter/lib/src/foundation/diagnostics.dart').
Try changing the type of the parameter, or casting the argument to 'Iterable<DiagnosticsNode> Function()'.
        informationCollector: (StringBuffer information) {
                              ^
Compiler failed on D:\code\flutter\projects\hobby\lib\main.dart
Finished with error: Gradle task assembleDebug failed with exit code 1

The method 'markNeedsBuild' was called on null

when using extended image inside listview.builder, sometimes it throw error from animation library and image resource service. try to scroll the image, when there are images that fail to load it throw error. can we catch the error and show a nice error message?

demo:

import 'dart:math';

import 'package:extended_image/extended_image.dart';
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage>
    with SingleTickerProviderStateMixin {
  AnimationController _animationController;
  Animation<double> _animation;
  Function animationListener;
  List<double> doubleTapScales = <double>[1.0, 2.0];

  @override
  void initState() {
    super.initState();
    _animationController = AnimationController(
        duration: const Duration(milliseconds: 150), vsync: this);
  }

  @override
  void dispose() {
    _animationController?.dispose();

    super.dispose();
  }

  List<String> imgs = [
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/00,0.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/00.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/001.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/002.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/003.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/004.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/005.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/006.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/007.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/008.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/009.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/010.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/011.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/012.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/013.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/014.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/015.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/016.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/017.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/018.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/019.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/020.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/021.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/022.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/023.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/024.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/025.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/026.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/027.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/028.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/029.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/030.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/031.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/032.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/033.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/034.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/035.jpg",
    "https://yuucdn.com/wp-content/uploads/S/Solo Leveling/Chapter 80/z10.jpg"
  ];
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          // Here we take the value from the MyHomePage object that was created by
          // the App.build method, and use it to set our appbar title.
          title: Text(widget.title),
        ),
        body: Container(
            child: ListView.builder(
          padding: EdgeInsets.zero,
          itemCount: imgs.length,
          itemBuilder: (cx, index) {
            var img = imgs[index];
            Widget image = ExtendedImage.network(
              img,
              cache: true,
              enableMemoryCache: true,
              loadStateChanged: (ExtendedImageState state) {
                switch (state.extendedImageLoadState) {
                  case LoadState.loading:
                    _animationController.reset();
                    return Center(
                        child: Container(
                      height: 250.0,
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: <Widget>[
                          CircularProgressIndicator(
                            valueColor:
                                new AlwaysStoppedAnimation<Color>(Colors.blue),
                          ),
                          SizedBox(height: 20.0),
                          Text("Memuat Gambar ${index + 1}/${imgs.length}")
                        ],
                      ),
                    ));
                    break;
                  case LoadState.completed:
                    _animationController.forward();

                    return null;

                    break;
                  case LoadState.failed:
                    _animationController.reset();
                    return Center(
                        child: Container(
                      height: 250,
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.center,
                        crossAxisAlignment: CrossAxisAlignment.center,
                        children: <Widget>[
                          Text(
                              "Gagal memuat gambar ${index + 1}/${imgs.length}"),
                          FlatButton(
                            onPressed: state.reLoadImage,
                            child: Text("Muat Ulang"),
                          )
                        ],
                      ),
                    ));
                    break;
                }
              },
              fit: BoxFit.contain,
              enableSlideOutPage: true,
              mode: ExtendedImageMode.Gesture,
              initGestureConfigHandler: (state) {
                double initialScale = 1.0;

                return GestureConfig(
                    inPageView: true,
                    initialScale: initialScale,
                    maxScale: max(initialScale, 5.0),
                    animationMaxScale: max(initialScale, 5.0),
                    //you can cache gesture state even though page view page change.
                    //remember call clearGestureDetailsCache() method at the right time.(for example,this page dispose)
                    cacheGesture: false);
              },
              onDoubleTap: (ExtendedImageGestureState state) {
                ///you can use define pointerDownPosition as you can,
                ///default value is double tap pointer down postion.
                var pointerDownPosition = state.pointerDownPosition;
                double begin = state.gestureDetails.totalScale;
                double end;

                //remove old
                _animation?.removeListener(animationListener);

                //stop pre
                _animationController.stop();

                //reset to use
                _animationController.reset();

                if (begin == doubleTapScales[0]) {
                  end = doubleTapScales[1];
                } else {
                  end = doubleTapScales[0];
                }

                animationListener = () {
                  //print(_animation.value);
                  state.handleDoubleTap(
                      scale: _animation.value,
                      doubleTapPosition: pointerDownPosition);
                };
                _animation = _animationController
                    .drive(Tween<double>(begin: begin, end: end));

                _animation.addListener(animationListener);

                _animationController.forward();
              },
            );

            return Container(child: image);
          },
        )));
  }
}

Error

I/flutter (27495): ══╡ EXCEPTION CAUGHT BY ANIMATION LIBRARY ╞═════════════════════════════════════════════════════════
I/flutter (27495): The following assertion was thrown while notifying listeners for AnimationController:
I/flutter (27495): setState() or markNeedsBuild() called during build.
I/flutter (27495): This ExtendedImageGesture widget cannot be marked as needing to build because the framework is
I/flutter (27495): already in the process of building widgets.  A widget can be marked as needing to be built during
I/flutter (27495): the build phase only if one of its ancestors is currently building. This exception is allowed
I/flutter (27495): because the framework builds parent widgets before children, which means a dirty descendant will
I/flutter (27495): always be built. Otherwise, the framework might not visit this widget during this build phase.
I/flutter (27495): The widget on which setState() or markNeedsBuild() was called was:
I/flutter (27495):   ExtendedImageGesture
I/flutter (27495): The widget which was currently being built when the offending call was made was:
I/flutter (27495):   ExtendedImage
I/flutter (27495): 
I/flutter (27495): When the exception was thrown, this was the stack:
I/flutter (27495): #0      Element.markNeedsBuild.<anonymous closure> (package:flutter/src/widgets/framework.dart:3670:11)
I/flutter (27495): #1      Element.markNeedsBuild (package:flutter/src/widgets/framework.dart:3685:6)
I/flutter (27495): #2      State.setState (package:flutter/src/widgets/framework.dart:1161:14)
I/flutter (27495): #3      _ExtendedImageGestureState._handleScaleUpdate (package:extended_image/src/gesture/extended_image_gesture.dart:213:7)
I/flutter (27495): #4      _ExtendedImageGestureState.handleDoubleTap (package:extended_image/src/gesture/extended_image_gesture.dart:371:5)
I/flutter (27495): #5      _MyHomePageState.build.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:demo/main.dart:196:25)
I/flutter (27495): #6      _AnimationController&Animation&AnimationEagerListenerMixin&AnimationLocalListenersMixin.notifyListeners (package:flutter/src/animation/listener_helpers.dart:124:19)
I/flutter (27495): #7      AnimationController.value= (package:flutter/src/animation/animation_controller.dart:362:5)
I/flutter (27495): #8      AnimationController.reset (package:flutter/src/animation/animation_controller.dart:381:5)
I/flutter (27495): #9      _MyHomePageState.build.<anonymous closure>.<anonymous closure> (package:demo/main.dart:113:42)
I/flutter (27495): #10     _ExtendedImageState.build (package:extended_image/src/extended_image.dart:781:24)
I/flutter (27495): #11     StatefulElement.build (package:flutter/src/widgets/framework.dart:4012:27)
I/flutter (27495): #12     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3924:15)
I/flutter (27495): #13     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (27495): #14     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3907:5)
I/flutter (27495): #15     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4053:11)
I/flutter (27495): #16     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3902:5)
I/flutter (27495): #17     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (27495): #18     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter (27495): #19     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (27495): #20     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (27495): #21     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3907:5)
I/flutter (27495): #22     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3902:5)
I/flutter (27495): #23     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (27495): #24     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter (27495): #25     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5092:14)
I/flutter (27495): #26     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (27495): #27     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter (27495): #28     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5092:14)
I/flutter (27495): #29     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (27495): #30     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter (27495): #31     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (27495): #32     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (27495): #33     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3907:5)
I/flutter (27495): #34     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3902:5)
I/flutter (27495): #35     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (27495): #36     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter (27495): #37     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (27495): #38     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (27495): #39     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3907:5)
I/flutter (27495): #40     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3902:5)
I/flutter (27495): #41     ParentDataElement.mount (package:flutter/src/widgets/framework.dart:4279:11)
I/flutter (27495): #42     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (27495): #43     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter (27495): #44     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (27495): #45     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (27495): #46     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3907:5)
I/flutter (27495): #47     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4053:11)
I/flutter (27495): #48     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3902:5)
I/flutter (27495): #49     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (27495): #50     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter (27495): #51     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (27495): #52     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (27495): #53     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3907:5)
I/flutter (27495): #54     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3902:5)
I/flutter (27495): #55     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (27495): #56     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter (27495): #57     SliverMultiBoxAdaptorElement.updateChild (package:flutter/src/widgets/sliver.dart:1181:36)
I/flutter (27495): #58     SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1166:20)
I/flutter (27495): #59     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2320:19)
I/flutter (27495): #60     SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:1159:11)
I/flutter (27495): #61     RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure> (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:354:23)
I/flutter (27495): #62     RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1715:58)
I/flutter (27495): #63     PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:796:15)
I/flutter (27495): #64     RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1715:13)
I/flutter (27495): #65     RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:343:5)
I/flutter (27495): #66     RenderSliverMultiBoxAdaptor.insertAndLayoutChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:489:5)
I/flutter (27495): #67     RenderSliverList.performLayout.advance (package:flutter/src/rendering/sliver_list.dart:191:19)
I/flutter (27495): #68     RenderSliverList.performLayout (package:flutter/src/rendering/sliver_list.dart:234:19)
I/flutter (27495): #69     RenderObject.layout (package:flutter/src/rendering/object.dart:1619:7)
I/flutter (27495): #70     RenderSliverPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:181:11)
I/flutter (27495): #71     RenderObject.layout (package:flutter/src/rendering/object.dart:1619:7)
I/flutter (27495): #72     RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:406:13)
I/flutter (27495): #73     RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1334:12)
I/flutter (27495): #74     RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1252:20)
I/flutter (27495): #75     RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1496:7)
I/flutter (27495): #76     PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:765:18)
I/flutter (27495): #77     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:346:19)
I/flutter (27495): #78     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:701:13)
I/flutter (27495): #79     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:285:5)
I/flutter (27495): #80     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1016:15)
I/flutter (27495): #81     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:958:9)
I/flutter (27495): #82     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:874:5)
I/flutter (27495): #86     _invoke (dart:ui/hooks.dart:236:10)
I/flutter (27495): #87     _drawFrame (dart:ui/hooks.dart:194:3)
I/flutter (27495): (elided 3 frames from package dart:async)
I/flutter (27495): 
I/flutter (27495): The AnimationController notifying listeners was:
I/flutter (27495):   AnimationController#08877(⏮ 0.000; paused)

I/flutter (27495): ══╡ EXCEPTION CAUGHT BY IMAGE RESOURCE SERVICE ╞════════════════════════════════════════════════════
I/flutter (27495): The following assertion was thrown when reporting an error to an image listener:
I/flutter (27495): setState() called after dispose(): _ExtendedImageState#2d7a5(lifecycle state: defunct, not mounted,
I/flutter (27495): stream: ImageStream#08c49(MultiFrameImageStreamCompleter#0c8aa, [720×2850] @ 1.0x, 1 listener),
I/flutter (27495): pixels: null)
I/flutter (27495): This error happens if you call setState() on a State object for a widget that no longer appears in
I/flutter (27495): the widget tree (e.g., whose parent widget no longer includes the widget in its build). This error
I/flutter (27495): can occur when code calls setState() from a timer or an animation callback.
I/flutter (27495): The preferred solution is to cancel the timer or stop listening to the animation in the dispose()
I/flutter (27495): callback. Another solution is to check the "mounted" property of this object before calling
I/flutter (27495): setState() to ensure the object is still in the tree.
I/flutter (27495): This error might indicate a memory leak if setState() is being called because another object is
I/flutter (27495): retaining a reference to this State object after it has been removed from the tree. To avoid memory
I/flutter (27495): leaks, consider breaking the reference to this object during dispose().
I/flutter (27495): 
I/flutter (27495): When the exception was thrown, this was the stack:
I/flutter (27495): #0      State.setState.<anonymous closure> (package:flutter/src/widgets/framework.dart:1105:9)
I/flutter (27495): #1      State.setState (package:flutter/src/widgets/framework.dart:1140:6)
I/flutter (27495): #2      _ExtendedImageState._loadFailed (package:extended_image/src/extended_image.dart:698:5)
I/flutter (27495): #3      ImageStreamCompleter.reportError (package:flutter/src/painting/image_stream.dart:474:24)
I/flutter (27495): #4      ImageStreamCompleter.setImage (package:flutter/src/painting/image_stream.dart:409:9)
I/flutter (27495): #5      MultiFrameImageStreamCompleter._emitFrame (package:flutter/src/painting/image_stream.dart:709:5)
I/flutter (27495): #6      MultiFrameImageStreamCompleter._decodeNextFrameAndSchedule (package:flutter/src/painting/image_stream.dart:694:7)
I/flutter (27495): <asynchronous suspension>
I/flutter (27495): #7      MultiFrameImageStreamCompleter._handleCodecReady (package:flutter/src/painting/image_stream.dart:644:7)
I/flutter (27495): #17     ExtendedNetworkImageProvider._loadAsync (package:extended_image_library/src/extended_network_image_provider.dart)
I/flutter (27495): <asynchronous suspension>
I/flutter (27495): #18     ExtendedNetworkImageProvider.load (package:extended_image_library/src/extended_network_image_provider.dart:62:14)
I/flutter (27495): #19     ImageProvider.resolve.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:flutter/src/painting/image_provider.dart:316:48)
I/flutter (27495): #20     ImageCache.putIfAbsent (package:flutter/src/painting/image_cache.dart:160:22)
I/flutter (27495): #21     ImageProvider.resolve.<anonymous closure>.<anonymous closure> (package:flutter/src/painting/image_provider.dart:316:25)
I/flutter (27495): #22     SynchronousFuture.then (package:flutter/src/foundation/synchronous_future.dart:38:29)
I/flutter (27495): #23     ImageProvider.resolve.<anonymous closure> (package:flutter/src/painting/image_provider.dart:313:11)
I/flutter (27495): #27     ImageProvider.resolve (package:flutter/src/painting/image_provider.dart:305:16)
I/flutter (27495): #28     _ExtendedImageState._resolveImage (package:extended_image/src/extended_image.dart:671:48)
I/flutter (27495): #29     _ExtendedImageState.didChangeDependencies (package:extended_image/src/extended_image.dart:628:5)
I/flutter (27495): #30     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4051:12)
I/flutter (27495): #31     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3902:5)
I/flutter (27495): #32     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (27495): #33     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter (27495): #34     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (27495): #35     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (27495): #36     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3907:5)
I/flutter (27495): #37     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3902:5)
I/flutter (27495): #38     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (27495): #39     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter (27495): #40     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5092:14)
I/flutter (27495): #41     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (27495): #42     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter (27495): #43     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5092:14)
I/flutter (27495): #44     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (27495): #45     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter (27495): #46     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (27495): #47     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (27495): #48     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3907:5)
I/flutter (27495): #49     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3902:5)
I/flutter (27495): #50     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (27495): #51     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter (27495): #52     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (27495): #53     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (27495): #54     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3907:5)
I/flutter (27495): #55     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3902:5)
I/flutter (27495): #56     ParentDataElement.mount (package:flutter/src/widgets/framework.dart:4279:11)
I/flutter (27495): #57     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (27495): #58     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter (27495): #59     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (27495): #60     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (27495): #61     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3907:5)
I/flutter (27495): #62     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4053:11)
I/flutter (27495): #63     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3902:5)
I/flutter (27495): #64     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (27495): #65     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter (27495): #66     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (27495): #67     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (27495): #68     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3907:5)
I/flutter (27495): #69     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3902:5)
I/flutter (27495): #70     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (27495): #71     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter (27495): #72     SliverMultiBoxAdaptorElement.updateChild (package:flutter/src/widgets/sliver.dart:1181:36)
I/flutter (27495): #73     SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1166:20)
I/flutter (27495): #74     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2320:19)
I/flutter (27495): #75     SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:1159:11)
I/flutter (27495): #76     RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure> (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:354:23)
I/flutter (27495): #77     RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1715:58)
I/flutter (27495): #78     PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:796:15)
I/flutter (27495): #79     RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1715:13)
I/flutter (27495): #80     RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:343:5)
I/flutter (27495): #81     RenderSliverMultiBoxAdaptor.insertAndLayoutChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:489:5)
I/flutter (27495): #82     RenderSliverList.performLayout.advance (package:flutter/src/rendering/sliver_list.dart:191:19)
I/flutter (27495): #83     RenderSliverList.performLayout (package:flutter/src/rendering/sliver_list.dart:234:19)
I/flutter (27495): #84     RenderObject.layout (package:flutter/src/rendering/object.dart:1619:7)
I/flutter (27495): #85     RenderSliverPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:181:11)
I/flutter (27495): #86     RenderObject.layout (package:flutter/src/rendering/object.dart:1619:7)
I/flutter (27495): #87     RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:406:13)
I/flutter (27495): #88     RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1334:12)
I/flutter (27495): #89     RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1252:20)
I/flutter (27495): #90     RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1496:7)
I/flutter (27495): #91     PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:765:18)
I/flutter (27495): #92     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:346:19)
I/flutter (27495): #93     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:701:13)
I/flutter (27495): #94     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:285:5)
I/flutter (27495): #95     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1016:15)
I/flutter (27495): #96     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:958:9)
I/flutter (27495): #97     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:874:5)
I/flutter (27495): #101    _invoke (dart:ui/hooks.dart:236:10)
I/flutter (27495): #102    _drawFrame (dart:ui/hooks.dart:194:3)
I/flutter (27495): (elided 15 frames from package dart:async and package dart:async-patch)
I/flutter (27495): ════════════════════════════════════════════════════════════════════════════════════════════════════
I/flutter (27495): Another exception was thrown: setState() called after dispose(): _ExtendedImageState#207e8(lifecycle state: defunct, not mounted, stream: ImageStream#7f972(MultiFrameImageStreamCompleter#96a3a, [720×3616] @ 1.0x, 1 listener), pixels: null)
I/flutter (27495): Another exception was thrown: setState() called after dispose(): _ExtendedImageState#5a814(lifecycle state: defunct, not mounted, stream: ImageStream#9f629(MultiFrameImageStreamCompleter#ad2c1, [720×3977] @ 1.0x, 1 listener), pixels: null)
I/flutter (27495): Another exception was thrown: setState() called after dispose(): _ExtendedImageState#bbce4(lifecycle state: defunct, not mounted, stream: ImageStream#9097f(MultiFrameImageStreamCompleter#ce8b3, [720×3134] @ 1.0x, 1 listener), pixels: null)
I/flutter (27495): Another exception was thrown: setState() called after dispose(): _ExtendedImageState#5e860(lifecycle state: defunct, not mounted, stream: ImageStream#530fa(MultiFrameImageStreamCompleter#dfc2e, [720×2415] @ 1.0x, 1 listener), pixels: null)
I/flutter (27495): Another exception was thrown: setState() or markNeedsBuild() called during build.
I/flutter (27495): Another exception was thrown: setState() called after dispose(): _ExtendedImageState#6a1bd(lifecycle state: defunct, not mounted, stream: ImageStream#2f9c1(MultiFrameImageStreamCompleter#92e26, [720×2406] @ 1.0x, 1 listener), pixels: null)
I/flutter (27495): Another exception was thrown: setState() called after dispose(): _ExtendedImageState#55640(lifecycle state: defunct, not mounted, stream: ImageStream#2d472(MultiFrameImageStreamCompleter#c714e, [720×3108] @ 1.0x, 1 listener), pixels: null)
I/flutter (27495): Another exception was thrown: setState() called after dispose(): _ExtendedImageState#9033d(lifecycle state: defunct, not mounted, stream: ImageStream#08618(MultiFrameImageStreamCompleter#8a1da, [720×4646] @ 1.0x, 1 listener), pixels: null)

Refresh image url

Can you tell me how can I refresh image cache for particular image URL?
Use case :

I upload the image to firebase storage with the same name(which replaces existing image). When I clear app data I get the correct image, It seems that the same URL image is not being downloaded again(Which is intended behavior) but I would like to refresh that image URL manually.

ImageStreamListener

报错

  • '_ExtendedImageState' is from 'package:extended_image/src/extended_image.dart' ('file:///Users/zhengxiaoshan/development/flutter/.pub-cache/hosted/pub.flutter-io.cn/extended_image-0.5.6/lib/src/extended_image.dart').
    Try correcting the name to the name of an existing method, or defining a method named 'ImageStreamListener'.
    ImageStreamListener(_handleImageChanged, onError: _loadFailed));

安卓集成flutter,遇到崩溃问题,

您好,情况是这样的我安卓项目通过aar形式集成flutter,
我flutter项目,中加入您的库,集成之后项目就崩溃,跑不起来,去掉您的库就可以。
单独跑flutter 项目,这个项目有您的库是没问题的。
可能我的表达能力不好,如果作者有兴趣的话,可以联系我,我吧当时的情况和项目演示一下。我的QQ是 407035000

Exception thrown in Flutter v1.5.9-pre.106/1.5.9-pre.107

Error:

Error: The argument type 'Null Function(StringBuffer)' can't be assigned to the parameter type 'Iterable Function()'.

  • 'StringBuffer' is from 'dart:core'.
  • 'Iterable' is from 'dart:core'.
  • 'DiagnosticsNode' is from 'package:flutter/src/foundation/diagnostics.dart' ('file:///Users/thinkdigital/development/flutter/packages/flutter/lib/src/foundation/diagnostics.dart').
    Try changing the type of the parameter, or casting the argument to 'Iterable Function()'.
    informationCollector: (StringBuffer information) {
    ^

this points to the file in "package:extended_image/src/network/extended_network_image_provider.dart"
line: 68

Image cache doesn't actually cache image

Hi, When I set cache to true for ExtendedImage.network, it still doesn't cache the image. To test this, I replaced the widget with a CachedNetworkImage and it works while offline, but not with ExtendedImage.
Here's a video demo.
https://streamable.com/cj9j5
Code:

ExtendedImage.network(
                    url,
                    cache: true,
                    shape: BoxShape.rectangle,
                    borderRadius: BorderRadius.circular(15),
                  ),

how to auto zoom to the crop area when initiated (fit: BoxFit.contain)

Is there any way to auto zoom to the square crop area when the widget is initiated. My image is 16:9, and i can only use BoxFit.contain to allow full image editing instead of BoxFit.cover (which only have square part), currently i use a work around (after build and rotate back and forth) to achieve this, but ugly...:

return ExtendedImage.memory(
      cachedOriFilters[filter?.name ?? "_"],
      fit: BoxFit.contain,
      mode: ExtendedImageMode.editor,
      extendedImageEditorKey: editorKey,
      initEditorConfigHandler: (state) {
        return EditorConfig(
          cornerSize: Size(0.0, 0.0),
          cropRectPadding: EdgeInsets.all(0.0),
          // maxScale: 2.0,
          cropAspectRatio: CropAspectRatios.ratio1_1,
          animationDuration: Duration(milliseconds: 0),
          tickerDuration: Duration(milliseconds: 0),
        );
      },
      loadStateChanged: (ExtendedImageState state) {
        switch (state.extendedImageLoadState) {
          case LoadState.loading:
            break;
          case LoadState.completed:
            SchedulerBinding.instance
                .addPostFrameCallback((_) => _onAfterBuild(context));
            break;
          case LoadState.failed:
            break;
        }
      },
    );
void _onAfterBuild(BuildContext context) {
    editorKey.currentState.rotate(right: true);
    editorKey.currentState.rotate(right: false);
  }

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.