πŸ“Έ Easy to use yet very customizable zoomable image widget for Flutter, Photo View provides a gesture sensitive zoomable widget. Photo View is largely used to show interacive images and other stuff such as SVG.

Overview

Flutter Photo View

Tests status Pub Chat

A simple zoomable image/content widget for Flutter.

PhotoView enables images to become able to zoom and pan with user gestures such as pinch, rotate and drag.

It also can show any widget instead of an image, such as Container, Text or a SVG.

Even though being super simple to use, PhotoView is extremely customizable though its options and the controllers.

Installation

Add photo_view as a dependency in your pubspec.yaml file (what?).

Import Photo View:

import 'package:photo_view/photo_view.dart';

Docs & API

The API Docs some detailed information about how to use PhotoView.

If you want to see it in practice, check the example app that explores most of Photo View's use cases or download the latest version apk on the releases page

(Very) Basic usage

Given a ImageProvider imageProvider (such as AssetImage or NetworkImage):

@override
Widget build(BuildContext context) {
  return Container(
    child: PhotoView(
      imageProvider: AssetImage("assets/large-image.jpg"),
    )
  );
}

Result:

In action

Read more about the PhotoView widget here.

Gallery

To show several images and let user change between them, use PhotoViewGallery.

Read more about the gallery here.

import 'package:photo_view/photo_view.dart';
import 'package:photo_view/photo_view_gallery.dart';
// ...


@override
Widget build(BuildContext context) {
  return Container(
    child: PhotoViewGallery.builder(
      scrollPhysics: const BouncingScrollPhysics(),
      builder: (BuildContext context, int index) {
        return PhotoViewGalleryPageOptions(
          imageProvider: AssetImage(widget.galleryItems[index].image),
          initialScale: PhotoViewComputedScale.contained * 0.8,
          heroAttributes: PhotoViewHeroAttributes(tag: galleryItems[index].id),
        );
      },
      itemCount: galleryItems.length,
      loadingBuilder: (context, event) => Center(
        child: Container(
          width: 20.0,
          height: 20.0,
          child: CircularProgressIndicator(
            value: event == null
                ? 0
                : event.cumulativeBytesLoaded / event.expectedTotalBytes,
          ),
        ),
      ),
      backgroundDecoration: widget.backgroundDecoration,
      pageController: widget.pageController,
      onPageChanged: onPageChanged,
    )
  );
}

Gallery sample in the example app:

In action

See the code here.

Usage with controllers

When you need to interact with PhotoView's internal state values, PhotoViewController and PhotoViewScaleStateController are the way to.

Controllers, when specified to PhotoView widget, enables the author(you) to listen for state updates through a Stream and change those values externally.

Read more about controllers here.

In the example app, we can see what can be achieved with controllers:

In action

More screenshots

Custom background,
small image
and custom alignment
Limited scale Hero animation
In action In action In action
Part of the screen Custom child
In action In action

Support us

You can support us by becoming a patron on Patreon, any support is much appreciated.

Patreon

Comments
  • [BUG] tap action is hard to invoke by finger

    [BUG] tap action is hard to invoke by finger

    Versions Flutter: 1.19.0-2.0.pre.83 Android 8 photo_view: ^0.9.2

    Describe the bug

    I used PhotoViewGallery.builder to show a set of images. But when I use finger to swipe or click, it is hard to invoke the action. Only by my little finger, will it be invoked sometimes.

    For example, onTapDown, onTapUp or double click to zoom. When I debug in emulator by mouse and use mouse in my Android mobile phone, it works normally. But it is too hard by finger.

    But if I use PhotoViewGestureDetector directly, everything works normally.

    To Reproduce

    Here is my code:

    Container(
      decoration: BoxDecoration(color: Colors.black),
      constraints: BoxConstraints.expand(
        height: MediaQuery.of(context).size.height,
      ),
      child: Stack(
        children: [
          Positioned.fill(
            child: PhotoViewGallery.builder(
              scrollPhysics: const BouncingScrollPhysics(),
              backgroundDecoration: BoxDecoration(color: Colors.black),
              loadingBuilder: (c, ImageChunkEvent e) => ImageLoadingView(title: '${_currentPage + 1}', event: e),
              loadFailedChild: ImageLoadFailedView(title: '${_currentPage + 1}'),
              onPageChanged: _onPageChanged,
              pageController: _controller,
              itemCount: widget.images.length,
              builder: (BuildContext context, int index) => PhotoViewGalleryPageOptions(
                initialScale: PhotoViewComputedScale.contained,
                minScale: PhotoViewComputedScale.contained / 2,
                maxScale: PhotoViewComputedScale.covered * 2,
                filterQuality: FilterQuality.high,
                onTapDown: (c, d, v) => _onPointerDown(d.globalPosition),
                onTapUp: _onImagePointerUp,
                heroAttributes: PhotoViewHeroAttributes(
                  tag: '${widget.images[index]}: $index',
                ),
                imageProvider: LocalOrNetworkImageProvider(
                  url: widget.images[index],
                  file: () async => _presenter.getFile(index: index),
                ),
              ),
            ),
          ),
          Positioned(
            bottom: 0,
            child: Listener(...),
          ),
        ),
      ),
    )
    
    
    double _pointerDownXPosition = 0;
    double _pointerDownYPosition = 0;
    
    void _onPointerDown(Offset pos) {
      _pointerDownXPosition = pos?.dx ?? 0;
      _pointerDownYPosition = pos?.dy ?? 0;
    }
    
    void _onImagePointerUp(BuildContext c, TapUpDetails d, PhotoViewControllerValue v) {
      var width = MediaQuery.of(context).size.width;
      var height = MediaQuery.of(context).size.height;
      Fluttertoast.showToast(
        msg: 'localPosition: ${d.localPosition}, globalPosition: ${d.globalPosition}, ' +
            'x: ${d.globalPosition?.dx}, y: ${d.globalPosition?.dy}, width: $width, height: $height',
      );
    }
    

    Screenshots

    Emulator:

    image

    Android by mouse:

    image

    Android by finger: (I can't capture it)

    bug P1 Gallery 
    opened by Aoi-hosizora 37
  • Flutter Update: 2.10.0 - Fix: Looking up a deactivated widget's ancestor is unsafe fix

    Flutter Update: 2.10.0 - Fix: Looking up a deactivated widget's ancestor is unsafe fix

    With the new stable version 2.10.0 of Flutter, there is a new problem. When building this widget with some images, it works fine. But when leaving/disposing this widget, there is crash report in the console that says Looking up a deactivated widget's ancestor is unsafe. The solution for this problem was to initialize the controller inside initState to ensure, that everything was initialized correctly in the lifecycle of a stateful widget. When the widget is disposed, there is no problem disposing these controllers.

    opened by karvulf 26
  • [BUG] Looking up a deactivated widget's ancestor is unsafe.

    [BUG] Looking up a deactivated widget's ancestor is unsafe.

    When I open Photoview and dont do anything bot pops the screen I get an error:

    FlutterError (Looking up a deactivated widget's ancestor is unsafe. At this point the state of the widget's element tree is no longer stable. To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.)

    If I triggers some events, e.g. panning, scaling ,it goes well.

    [βœ“] Flutter (Channel master, 2.6.0-12.0.pre.869, on macOS 11.4 20F71 darwin-x64, locale sv-SE) [βœ“] Android toolchain - develop for Android devices (Android SDK version 30.0.2) [βœ“] Xcode - develop for iOS and macOS (Xcode 13.1) [βœ“] Chrome - develop for the web [βœ“] Android Studio (version 2020.3) [βœ“] VS Code (version 1.62.3)

    A known behaviour?

    bug 
    opened by PeterLjunggren 24
  • Popup photo view

    Popup photo view

    Is your feature request related to a problem? Please describe. It is quite troublesome to implement a popup photo view with zoom, drag and also drag to dismiss (change in transparency), since this library already provided the foundation of zoomable image, it is great that the library able to extend to a popup version.

    Describe the solution you'd like A popup photo view which able to zoom, drag and also drag to dismiss (change in transparency) similar to Facebook.

    enhancement 
    opened by anderscheow 18
  • Waiting for new release with Flutter 2.10.x

    Waiting for new release with Flutter 2.10.x

    Error "Looking up a deactivated widget's ancestor is unsafe." fixed by https://github.com/bluefireteam/photo_view/pull/499, but I'm still waiting for new release.

    bug 
    opened by saelco 17
  • When I use the PhotoViewGalleryPageOptions.customChild , the scaleState doesn't work

    When I use the PhotoViewGalleryPageOptions.customChild , the scaleState doesn't work

    I don't know if I use the controller correctly. but it still didn't work when i have tried many times? could you please pointed out where my fault is?

    final item = widget.galleryItems[index];
        return PhotoViewGalleryPageOptions.customChild(
          scaleStateController: scaleStateController,
          child: GestureDetector(
            behavior: HitTestBehavior.translucent,
            onTap: () {
              Navigator.of(context).pop();
            },
            onDoubleTap: () {
              scaleStateController.scaleState = PhotoViewScaleState.zoomedOut;
            },
            child: CustomImage(
              imageSize: ImageSize.original,
              width: MediaQuery.of(context).size.width,
              imageUrl: item,
            )
          ),
          initialScale: 0.5,
          minScale: PhotoViewComputedScale.contained * 1,
          maxScale: PhotoViewComputedScale.covered * 2,
        );
      }
    
    

    what i want to deal is to zoom the pic by doubleTap

    question awaiting-further-comments 
    opened by cherrybiu 14
  • PhotoViewGallery does not switch image sometimes and the onTapUp callback dose not run.

    PhotoViewGallery does not switch image sometimes and the onTapUp callback dose not run.

    PhotoViewGallery does not scroll sometime and the onTapUp callback dose not run.

    What is the current behavior? When i am scrolling the gallery horizontal to switch the image , the gallery does not response. I set onTapUp callback to the options, but the tapup callback does not run.

    Versions: photo_view 0.9.0 OS:Android ,have not test ios yet Flutter:Flutter 1.9.1+hotfix.6

    I am using flutter_advanced_networkimage as the imageprovider , is it related?

    bug Gallery 
    opened by ShshyDevooo 14
  • [BUG]Error: The argument type 'PointerEvent' can't be assigned to the parameter type 'PointerDownEvent'

    [BUG]Error: The argument type 'PointerEvent' can't be assigned to the parameter type 'PointerDownEvent'

    Error: The argument type 'PointerEvent' can't be assigned to the parameter type 'PointerDownEvent'.

    Error generated on build progress... Its necessary to change void addAllowedPointer(PointerEvent event) to void addAllowedPointer(PointerDownEvent event) according https://flutter.dev/docs/release/breaking-changes/gesture-recognizer-add-allowed-pointer

    bug awaiting-further-comments 
    opened by rafaelgs2311 13
  • Gallery stopped working on Android after Flutter 1.20 upgrade

    Gallery stopped working on Android after Flutter 1.20 upgrade

    Cannot browse gallery images. Images do not respond to slides and taps, only to resize. This is on Android only. iPhone works as expected. This started after Flutter 1.2 upgrade.

    bug P1 Gallery Framework bug 
    opened by brusinovic 13
  • [QUESTION] Not clear how to programmatically rotate the (custom) child

    [QUESTION] Not clear how to programmatically rotate the (custom) child

    I'm wanting to allow the user to tap a button to rotate the photo view custom child by 90 degrees left or right by tapping a button, but they should not be able to rotate the image manually.

    I found that I could not achieve this at all unless the photo view's enableRotation parameter is enabled. I had expected this to only relate to user actions.

    Secondly, it isn't clear how PhotoViewController's rotation value should be updated to perform the rotation. My initial thought was to add either 90 or 0.25 to the rotation value, but this resulted in a child that was not at right angles to the initial orientation. I was surprised to find that adding a value of 1.57 seemed to do what I wanted – but still wrong after many rotations.

    It would be useful to have an example that should how to rotate programmatically by a number of degrees.

      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: SafeArea(
            child: Stack(
              children: <Widget>[
                PhotoView.customChild(
                  enableRotation: true,
                  controller: _photoViewController,
                  backgroundDecoration: BoxDecoration(
                    color: Brand.of(context).secondaryColor,
                  ),
                  child: Icon(Icons.home, size: 144) ?? FloorplanImage(),
                  initialScale: PhotoViewComputedScale.contained,
                  minScale: PhotoViewComputedScale.covered * 0.5,
                  maxScale: PhotoViewComputedScale.covered * 2.0,
                ),
                Positioned(
                  top: 30,
                  right: 30,
                  child: FloatingActionButton(
                    child: Icon(Icons.rotate_right),
                    onPressed: () => _photoViewController.rotation = _photoViewController.rotation + 1.5705,
                  ),
                ),
              ],
            ),
          ),
        );
      }
    
    bug 
    opened by scopendo 13
  • Set a different initial position different from center.

    Set a different initial position different from center.

    List<Map> imageList = [
      {
        'provider': const NetworkImage(
            "https://img.zcool.cn/community/012c1559b2441ea801211d258355d3.jpg@1280w_1l_2o_100sh.jpg"),
        'tag': 'tag1',
        'fillScale': PhotoViewComputedScale.covered
      },
      {
        'provider': const NetworkImage(
            "http://img.pptjia.com/image/20180117/767f4b74a8d7b453b149430ee364c9ce.jpg"),
        'tag': 'tag2',
        'fillScale': PhotoViewComputedScale.contained
      },
      {
        'provider': const NetworkImage(
            "http://www.hiphotos.baidu.com/image/pic/item/8644ebf81a4c510f3666841a6b59252dd42aa514.jpg"),
        'tag': 'tag3',
        'fillScale': PhotoViewComputedScale.contained
      },
      {
        'provider':
            const NetworkImage("http://www.17qq.com/img_qqtouxiang/30526384.jpeg"),
        'tag': 'tag4',
        'fillScale': PhotoViewComputedScale.contained
      }
    ];
    
    List<PhotoViewGalleryPageOptions> _takePageOptions(
          List<Map> imageProviderList) {
        return imageProviderList.map(
          (map) {
            return PhotoViewGalleryPageOptions(
              imageProvider: map['provider'],
              minScale: map['fillScale'],
              maxScale: PhotoViewComputedScale.covered * 1.1,
              initialScale: map['fillScale'],
              heroTag: map['tag'],
            );
          },
        ).toList();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Container(
              constraints: BoxConstraints.expand(
                height: MediaQuery.of(context).size.height,
              ),
              child: Stack(
                alignment: Alignment.bottomRight,
                children: <Widget>[
                  PhotoViewGallery(
                    pageOptions: _takePageOptions(widget.imageList),
                    // pageOptions: <PhotoViewGalleryPageOptions>[
                    //   PhotoViewGalleryPageOptions(
                    //     imageProvider: widget.imageProvider,
                    //     heroTag: "tag1",
                    //   ),
                    //   PhotoViewGalleryPageOptions(
                    //       imageProvider: widget.imageProvider2,
                    //       heroTag: "tag2",
                    //       maxScale: PhotoViewComputedScale.contained * 0.3),
                    //   PhotoViewGalleryPageOptions(
                    //     imageProvider: widget.imageProvider3,
                    //     minScale: PhotoViewComputedScale.contained * 0.8,
                    //     maxScale: PhotoViewComputedScale.covered * 1.1,
                    //     heroTag: "tag3",
                    //   ),
                    // ],
                    loadingChild: widget.loadingChild,
                    backgroundDecoration: widget.backgroundDecoration,
                    pageController: widget.pageController,
                    onPageChanged: onPageChanged,
                  ),
                  Container(
                    padding: const EdgeInsets.all(20.0),
                    child: Text(
                      "Image ${currentIndex + 1}",
                      style: const TextStyle(
                          color: Colors.white, fontSize: 17.0, decoration: null),
                    ),
                  )
                ],
              )),
        );
      }
    
    enhancement 
    opened by LebenNNA 13
  • [desktop application] Next/Previous image with keyboard

    [desktop application] Next/Previous image with keyboard

    Hi,

    I read the doc and I don't manage to find a way to move to the next ou previous image from a keyboard key on a desktop application. Did I miss something ? Is there any current way to do it ?

    Thanks.

    opened by DanielCambray 0
  • App crashes when zoom is pinched to maximum

    App crashes when zoom is pinched to maximum

    πŸ› Bug Report

    When users pinch zoom to the maximum, it starts lagging until the app crashes.

    Expected behavior

    The hero animation when pinching the maximum zoom value should not crash the app.

    Reproduction steps

    Just place a PhotoView showing an image (in my case it's a 500x500 PNG file) with disableGestures = false and zoom it to the maximum using your fingers.

    Version: 0.14.0

    Platform: Android 13, iOS 15

    bug 
    opened by pabloasenjo3 0
  • [BUG] Make PhotoViewController.scale should not be null

    [BUG] Make PhotoViewController.scale should not be null

    Describe the bug Currently, PhotoViewController.scale is nullable. However, this value should not be null according to @renancaraujo.

    Although, I do not envision how this value can be nullable. If so, docs should be added to document under what scenarios this values is nullable.

    To Reproduce (https://github.com/bluefireteam/photo_view/blob/7e8c335ad718c71e22402a920c939d949106d508/lib/src/controller/photo_view_controller.dart#L56)

    What is the current behavior? PhotoViewController.scale is double? == true PhotoViewController.scale is double == false

    Expected behavior PhotoViewController.scale is double == true

    Screenshots N/a

    Which versions of Flutter/Photo View, and which browser / OS are affected by this issue? Did this work in previous versions of Photo View?

    Photo View ^0.14.0

    Flutter doctor
    Doctor summary (to see all details, run flutter doctor -v):
    [βœ“] Flutter (Channel stable, 3.0.5, on macOS 12.2.1 21D62 darwin-arm, locale
        en-GB)
    [βœ“] Android toolchain - develop for Android devices (Android SDK version 33.0.0)
    [βœ“] Xcode - develop for iOS and macOS (Xcode 13.4.1)
    [βœ“] Chrome - develop for the web
    [βœ“] Android Studio (version 2021.2)
    [βœ“] VS Code (version 1.70.2)
    [βœ“] Connected device (3 available)
    [βœ“] HTTP Host Availability
    

    β€’ No issues found!

    bug P3 
    opened by alestiago 1
  • [BUG] Cannot rotate + zoom corners

    [BUG] Cannot rotate + zoom corners

    Describe the bug: Take a portrait photo. Lets name top-left most point A. Rotate photo 90-degrees anti-clockwise (make it lanscape), zoom-in, now try to look at zoomed point A. We won't be able to scroll the photo to the point to see it. PS: The same will happen for a bottom-left point in a landscape-photo.

    To Reproduce: Attached a GIF. Any portrait photo will do.

    Version: 0.14.0. This has always been the case.

    My guess is that it is happening because the proportion of photo remains same, even when it is rotated. So, when pulling-area of the zoomed+rotated photo in one direction ends earlier than expected.

    Peek 2022-07-16 12-46

    bug P1 
    opened by beriaanirudh 1
Releases(0.14.0)
  • 0.14.0(May 24, 2022)

    Fixed

    • Made wantKeepAlive parameter to make it optional #479
    • Update README Urls #471
    • Null check operator used on a null value #476
    • Flutter Update: 2.10.0 - Fix: Looking up a deactivated widget's ancestor is unsafe fix #499
    Source code(tar.gz)
    Source code(zip)
  • 0.13.0(Oct 5, 2021)

    Fixed

    • Network image issue on flutter 2.5 #467 #464

    Added

    • allowImplicitScrolling for preloading next page on PageView #458
    • AutomaticKeepAliveClientMixin to keep state on photoview #452
    Source code(tar.gz)
    Source code(zip)
  • 0.12.0(Jul 19, 2021)

    Fixed:

    • 'PointerEvent' can't be assigned to the parameter type 'PointerDownEvent' https://github.com/fireslime/photo_view/issues/423#issuecomment-847681903 #420 #441 #442 #445
    • Fix onScaleEnd operator #415

    Added:

    • Added enablePanAlways to allow the user to pan any view without restrictions #427
    Source code(tar.gz)
    Source code(zip)
  • 0.11.1(Mar 9, 2021)

  • 0.11.0(Mar 7, 2021)

    Added

    • initialScale on controller #322 #289
    • [Breaking] Sound null safety support thanks to @DevNico #375

    Removed

    • loadFailedChild in favor of errorBuilder. #320 #287
    Source code(tar.gz)
    Source code(zip)
  • 0.10.3(Nov 15, 2020)

  • 0.10.2(Aug 22, 2020)

    Added

    • errorBuilder option to show a widget when things go south when retrieving the image. #320 #287

    Deprecated

    • loadFailedChild in favor of errorBuilder. #320 #287

    Fixed

    • loadFailedChild doesn't show error widget #320 #316
    • Hero animation should work in all situations #320 #303
    Source code(tar.gz)
    Source code(zip)
  • 0.10.1(Aug 18, 2020)

  • 0.10.0(Aug 12, 2020)

    Removed [breaking]

    • loadingChild options in both PhotoView and PhotoViewGallery in favor of loadingBuilder. Previously deprecated; #307

    Fixed

    • Unnecessary scale state controller value streamed #227 #267
    • GestureDetector winning arena issue that made the gallery not work well #266 #212
    • When the network goes down, photo_view would crash #275 #308

    Internal

    • Updatde example app #300
    Source code(tar.gz)
    Source code(zip)
  • 0.9.2(Feb 15, 2020)

    Added

    • loadingBuilder which provides a way to create a progress loader. Thanks to @neckaros #250 #254

    Deprecated

    • loadingChild options in both PhotoView and PhotoViewGallery in favor of loadingBuilder;

    Fixed

    • Gallery undefined issue #251
    • PhotoViewCore throws when using PhotoCiewScaleStateController within gallery. #254 #217
    • basePosition on PhotoViewGallery being ignored #255 #219
    Source code(tar.gz)
    Source code(zip)
    example_app.zip(22 bytes)
  • 0.9.1(Jan 7, 2020)

    Added

    • filterQuality option to the property to improve image quality after scale #228
    • loadFailedChild option to specify a widget instance to be shown when the image retrieval process failed #231

    Changed

    • Internal: stop using deprecated inheritFromWidgetOfExactType in favor of dependOnInheritedWidgetOfExactType #235
    • Made childSize optional for PhotoViewGalleryPageOptions.customChild #229
    Source code(tar.gz)
    Source code(zip)
  • 0.9.0(Nov 21, 2019)

    Added

    • tightMode option that allows PhotoView to be used inside a dialog. #167 #211
    • PhotoViewGestureDetectorScope widget that allows PhotoView to be used on scrollable contexts (PageView, list view etc) #211
    • Dialogs and onetap example on the exmaple app #211

    Changed

    • Made childSize to be optional. Now it expands if no value is provided #210 #199
    Source code(tar.gz)
    Source code(zip)
  • 0.8.2(Nov 19, 2019)

  • 0.8.1(Nov 19, 2019)

    Added

    • Web support on the example app, thanks to @YuyaAbo #201

    Fixed

    • ScaleState were not respected when resizing photoview widget. #163 #207
    Source code(tar.gz)
    Source code(zip)
  • 0.8.0(Nov 7, 2019)

    Changed

    • Change to our own custom gesture detector, making it work nicely with an extenal gesture detector. It solves #41 which was previously tackled on #185 but with some minor bugs (vertical scrolling pageviews and proper responsiveness on pan gestures). #197
    • Renamed PhotoViewImageWrapper to PhotoViewCore and reorganized src files, not externally relevant. #197

    Removed

    • [BREAKING] Removed unnecessary function typedefs like PhotoViewScaleStateChangedCallback #197
    • [BREAKING] Removed usePageViewWrapper option from the gallery #197
    Source code(tar.gz)
    Source code(zip)
  • 0.7.0(Nov 5, 2019)

  • 0.6.0(Oct 16, 2019)

  • 0.5.0(Sep 7, 2019)

    Changed

    • [BREAKING] All hero attributes where moved into a new data class: PhotoViewHeroAttributes. #175 #177
    • Some internal changes fixed a severe memory leak involving controllers delegate: #180
    Source code(tar.gz)
    Source code(zip)
  • 0.4.2(Jul 23, 2019)

  • 0.4.1(Jul 11, 2019)

    First release since halt due to Flutter breaking changes.

    With this version, Photo view is stable compatible. It means that every new release must be compatible with the channel master. Breaking changes that are still on master or beta channels will not be included on any new release.

    Added

    • The PageView reverse parameter #159
    Source code(tar.gz)
    Source code(zip)
  • 0.4.0(May 25, 2019)

    ** Fix Flutter breaking change **

    • [BREAKING] This release requires Flutter 1.6.0, which in the date of this release, is not even beta. This is due to several master channel users who complained on a recent breaking change which broke one of the PhotoView core features. #144 #143 #147 https://github.com/flutter/flutter/pull/32936
    Source code(tar.gz)
    Source code(zip)
  • 0.3.3(May 8, 2019)

  • 0.3.2(May 8, 2019)

    Fixed

    • FlutterError compatibility with breaking changing breaking for Flutter channel master users. #135 #136 #137
    • onTapUp and onTapDown overriding higher onTap handle #134 #138
    Source code(tar.gz)
    Source code(zip)
  • 0.3.1(Apr 23, 2019)

  • 0.3.0(Apr 21, 2019)

    Changed

    • [BREAKING] PhotoViewControllerValue does not contain scaleState value anymore, now you should control that value ona separate controller: PhotoViewScaleStateController. That is due to some concerns expressed #127. All details on controller docs #129 #127

    Added

    • scaleStateController option to PhotoView and PhotoViewGalleryPageOptions #129
    Source code(tar.gz)
    Source code(zip)
    app-release.apk(9.41 MB)
  • 0.2.5(Apr 20, 2019)

    Added

    • Two new callbacks onTapUp and onTapDown #122
    • A exclusive stream for scaleState in the controller #124

    Fixed

    • Gallery swipe glitch: do not lock when zooming in #124 #105
    • herotag is an Object, not a String anymore #122

    Removed

    • [BREAKING] Scale state zooming has been replaced by zoomingIn and zoomingOut #124
    Source code(tar.gz)
    Source code(zip)
  • 0.2.4(Apr 9, 2019)

    Changed

    • [BREAKING] PhotoViewController no longer extends ValueNotifier, instead, it contains one. Method addListener is no longer available due to a race condition that creates bugs. #106
    Source code(tar.gz)
    Source code(zip)
  • 0.2.3(Apr 9, 2019)

  • 0.2.2(Apr 8, 2019)

  • 0.2.1(Apr 8, 2019)

Owner
Fire Slime Games
Fire Slime Games
A scrollable, dismissable by swiping, zoomable, rotatable image gallery on which you can add a dynamic overlay.

Swipe Image Gallery A scrollable, dismissable by swiping, zoomable, rotatable image gallery on which you can add a dynamic overlay. While it is intend

null 20 Dec 7, 2022
SVG parsing, rendering, and widget library for Flutter

flutter_svg Draw SVG (and some Android VectorDrawable (XML)) files on a Flutter Widget. Getting Started This is a Dart-native rendering library. Issue

Dan Field 1.5k Jan 6, 2023
Crop any widget/image in Android, iOS, Web and Desktop with fancy and customizable UI, in pure Dart code.

crop A Flutter package for cropping any widget, not only images. This package is entirely written in Dart and supports Android, iOS, Web and Desktop.

Mahdi 225 Jan 6, 2023
A flutter plugin which provides Crop Widget for cropping images.

A flutter plugin which provides Crop Widget for cropping images. crop_your_image provides only minimum UI for deciding cropping area inside images. Other UI parts, such as "Crop" button or "Change Aspect Ratio" button, need to be prepared by each app developers.

Chooyan 96 Dec 31, 2022
Download, cache and show images in a flutter app

Cached network image A flutter library to show images from the internet and keep them in the cache directory. How to use The CachedNetworkImage can be

Baseflow 2.1k Jan 3, 2023
Flutter package for Image Carousel It is an image carousel widget.

Snapshot Carousel Flutter package for Image Carousel It is an image carousel widget. Supported platforms Flutter Android Flutter iOS Flutter web Flutt

Mrigank Anand 12 Jun 3, 2021
A flutter package which makes it easy to track a series of images.

A flutter package which makes it easy to track a series of images.

Jaehee Kim 2 Oct 7, 2022
A simple and easy flutter demo to crop image

flutter_image_crop A simple demo to crop image on flutter easily. A Chinese version of this document can be found here Flutter_image_crop Plugin will

路小飞 3 Jul 8, 2021
Loading indicator GIFs. Material and Cupertino (Android and iOS) loading indicators in assorted sizes. Use as placeholders for loading remote image assets. Demo: https://gallery.codelessly.com/flutterwebsites/loadinggifs/

Loading GIFs High quality Android and iOS loading spinners. View Demo Loading GIFs is a collection of high fidelity loading animations in GIF format.

Codelessly 31 Dec 23, 2022
A Flutter widget that paints an image and moves it at a slower speed than the main scrolling content.

A Flutter widget that paints an image and moves it at a slower speed than the main scrolling content. Installation Add dependency to your pubspec.yaml

Anatoly Pulyaevskiy 272 Dec 23, 2022
A Flutter plugin for Android and iOS supports cropping images

Image Cropper A Flutter plugin for Android and iOS supports cropping images. This plugin is based on two different native libraries so it comes with d

HungHD 891 Dec 28, 2022
Minimal Unsplash Android App to easily search and download images

Minimal Unsplash Android App to easily search and download images

Yash Garg 18 Dec 7, 2022
Instagram tool to download images, reels, videos and more.

Instagram tool to download images, reels, videos and more.

Yuji 34 Jan 2, 2023
Load GIF images and can set framerate

Load GIF images and can set framerate

Rafael Almeida Barbosa 9 Dec 14, 2022
A flutter package to convert any widget to an Image.

Davinci A package to convert any widget to an image which can be saved locally or can be shared to other apps and chats. ?? Preview ℹ️ Usage Prerequis

Sai Gokula Krishnan 37 Dec 20, 2022
Build a fancy looking avatar widget with a colorfull ring around the image

Build a fancy looking avatar widget with a colorfull ring around the image

PaweΕ‚ WacΕ‚awiak 0 Feb 19, 2022
Simple and effective cross platform image saver for flutter, supported web and desktop

Simple and effective cross platform image saver for flutter, supported web and desktop

7c00 3 Oct 5, 2022
Flutter plugin that allows you to display multi image picker on iOS and Android. πŸ‘ŒπŸ”πŸŽ‰

IMPORTANT: This repository has been archived and no longer mantained. As I don't have time anymore to work on the package it became very outdated. For

Radoslav Vitanov 898 Apr 29, 2021
A Flutter image editor with support for paint, text, filters, emojis, stickers and more

Flutter Image Editor Plugin with simple, easy support for image editing using Paints, Text, Filters, Emoji and Sticker like stories.

null 44 Dec 22, 2022