๐Ÿ“ธ Easy to use yet very customizable zoomable image widget for Flutter, Photo View provides a gesture sensitive zoomable widget.

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
Blue Fire
Team working on open source packages and plugins for Flutter, including Flame, Audioplayers, Photo View, and more.
Blue Fire
Displays a highly customizable week view (or day view) which is able to display events, to be scrolled, to be zoomed-in & out and a lot more !

Displays a highly customizable week view (or day view) which is able to display events, to be scrolled, to be zoomed-in & out and a lot more !

Hugo Delaunay 196 Dec 2, 2022
RFlutter Alert is super customizable and easy-to-use alert/popup dialogs for Flutter.

RFlutter Alert is super customizable and easy-to-use alert/popup dialogs for Flutter. You may create reusable alert styles or add buttons as much as you want with ease.

Ratel 362 Jan 1, 2023
SKAlertDialog - A highly customizable, powerful and easy-to-use alert dialog for Flutter.

SKAlertDialog A highly customizable, powerful and easy-to-use alert dialog for Flutter. GIF Screenshots SKAlertDialog Basic Alert Alert with buttons A

Senthil_Kumar 7 May 18, 2022
A widget that can be dragged and scrolled in a single gesture and snapped to a list of extents.

Sliding Sheet A widget that can be dragged and scrolled in a single gesture and snapped to a list of extents. Click here to view the full example. Ins

null 396 Mar 10, 2022
A widget to provides horizontal or vertical multiple split view for Flutter.

Multi split view A widget to provides horizontal or vertical multiple split view for Flutter. Horizontal or vertical Configurable weight or size for e

Carlos Eduardo Leite de Andrade 63 Dec 28, 2022
An extensive snap tool/widget for Flutter that allows very flexible snap management and snapping between your widgets.

An extensive snap tool/widget for Flutter that allows very flexible snap management and snapping between your widgets.

AliYigitBireroglu 101 Dec 16, 2022
This flutter package provides an easy implementation of a Slider Button to cancel current transaction or screen

This flutter package provides an easy implementation of a Slider Button to cancel current transaction or screen

null 222 Nov 8, 2022
Flutter Color Picker Wheel - an easy to use widget which can be heavily customized

Flutter Color Picker Wheel Flutter Color Picker Wheel is an easy to use widget which can be heavily customized. You can use the WheelColorPicker direc

Kexin Lu 35 Oct 4, 2022
A popup simple topModalSheet menu button widget with handsome design and easy to use

top_modal_sheet A popup simple topModalSheet menu button widget with handsome design and easy to use. Installations Add top_modal_sheet: ^1.0.0 in you

Baldemar Alejandres 5 Jul 29, 2022
A really easy to use flutter toast library

BotToast ?? A really easy to use flutter toast library! Language: English | ไธญๆ–‡็ฎ€ไฝ“ ?? Overview ?? Online Demo ?? Example ?? Renderings ?? Getting starte

null 719 Dec 28, 2022
A Redux version tailored for Flutter, which is easy to learn, to use, to test, and has no boilerplate

A Redux version tailored for Flutter, which is easy to learn, to use, to test, and has no boilerplate. Allows for both sync and async reducers.

Marcelo Glasberg 214 Dec 13, 2022
A Simple and easy to use flutter package for showing progress bar.

progress_dialog A Simple and easy to use flutter package for showing progress bar. #Usage Import the package import 'package:custom_progress_dialog/cu

Vikas Jilla 6 May 23, 2022
Flutter ScrollView Observer - a library of widget that can be used to listen for child widgets those are being displayed in the scroll view

Flutter ScrollView Observer - a library of widget that can be used to listen for child widgets those are being displayed in the scroll view

ๆž—ๆดต้”‹ 67 Jan 6, 2023
A Flutter widget which synchronize a ScrollView and a custom tab view

scrollable_list_tabview A Flutter widget which synchronize a ScrollView and a custom tab view. The main idea is to create a custom tab view synchroniz

Aswanath C K 0 Apr 12, 2022
A widget with side-by-side source code view.

A widget with side-by-side source code view. Extracted from the flutter-catalog open-source app.

xwei 23 Aug 29, 2022
PowerFileView - A powerful file view widget, support a variety of file types, such as Doc Eexcl PPT TXT PDF and so on, Android is implemented by Tencent X5, iOS is implemented by WKWebView.

PowerFileView - A powerful file view widget, support a variety of file types, such as Doc Eexcl PPT TXT PDF and so on, Android is implemented by Tencent X5, iOS is implemented by WKWebView.

Yao 8 Oct 22, 2022
Customizable Flutter widget which syncronize ScrollView with PageView as tabs

scrollable_list_tab_scroller Customizable Flutter widget which syncronize ScrollView with PageView as tabs. Create a custom page view as tabs which sy

Railson Ferreira de Souza 4 Dec 21, 2022
Flutter reaction button plugin it is fully customizable widget such as Facebook reaction button

Flutter Reaction Button Flutter button reaction it is fully customizable widget such as Facebook reaction button. Preview Demo Usage Include 'flutter_

Abdelouahed Medjoudja 174 Dec 19, 2022
Flutter widget form select a date in horizontal timeline with customizable styles.

Flutter widget form select a date in horizontal timeline with customizable styles. Getting Started You can use this package when you need to add a dat

Jose Manuel Mรกrquez 158 Dec 2, 2022