A simple zoomable image/content widget for Flutter.

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/[email protected]_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
A sliding up panel widget which can be used to show or hide content, beautiful and simple.

flutter_sliding_up_panel A sliding up panel widget which can be used to show or hide content, beautiful and simple. demo Getting Started dependencies:

null 25 Dec 12, 2022
A Flutter widget for inputting content with a fixed length, visually treating each character as a separate segment.

code_input A Flutter widget for inputting content with a fixed length, visually treating each character as a separate segment. Pub Package GitHub Repo

Raouf Rahiche 69 Mar 25, 2022
A simple Flutter widget to add in the widget tree when you want to show nothing, with minimal impact on performance.

nil A simple widget to add in the widget tree when you want to show nothing, with minimal impact on performance. Why? Sometimes, according to a condit

Romain Rastel 127 Dec 22, 2022
Listview builder with image and text

listview_builder_with_image_and_text A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resource

null 0 May 4, 2022
A flutter carousel widget, support infinite scroll, and custom child widget.

carousel_slider A carousel slider widget. Features Infinite scroll Custom child widgets Auto play Supported platforms Flutter Android Flutter iOS Flut

Bart T 1 Nov 25, 2021
A Flutter Widget to make interactive timeline widget.

Bubble Timeline Package A Flutter Widget to make interactive timeline widget. This widget can be used to make Event Timelines, or Timelines for certai

Vansh Goel 12 Sep 22, 2022
A widget lib that the widget in this lib can react to flutter ScrollController's offset

Language: English | 中文简体 linked_scroll_widgets A lib full of widgets that can react to the scrollController's offset change,to custom your UI effect.

WenJingRui 8 Oct 16, 2022
Full customable rolling switch widget for flutter apps based on Pedro Massango's 'crazy-switch' widget

lite_rolling_switch Full customable rolling switch widget for flutter apps based on Pedro Massango's 'crazy-switch' widget https://github.com/pedromas

Eduardo Muñoz 48 Dec 1, 2022
Progress Dialog widget for flutter projects with ability to customize loading widget, background color and background blur.

DISCONTINUED Checkout ArsDialog ars_progress_dialog Customizable progress dialog for Flutter applications with smooth animation for background dim col

Arsam 8 Apr 15, 2022
A Flutter widget that will give a Glitch Animation Effect to it's child widget.

GlitchEffect A Flutter widget that will give a Glitch Animation Effect to it's child widget. Installation Add the latest version of package to your pu

Sameer Singh 6 Nov 25, 2022
Widget, that can make any static located widget hidable

Installing See the official installing guidline from hidable/install Usage & Overview To start using Hidable widget, we have to create a ScrollControl

Anon 18 Dec 16, 2022
A widget that allow user resize the widget with drag

Flutter-Resizable-Widget A widget that allow user resize the widget with drag Note: this widget uses Getx Example bandicam.2021-11-11.12-34-41-056.mp4

MohammadAminZamani.afshar 22 Dec 13, 2022
A simple Flutter widget library that helps us to select days in a week.

A simple Flutter widget library that helps us to select days in a week.

Shan Shaji 4 Oct 9, 2022
ListTileSwitch is simple widget that combines ListTile with a switch.

ListTileSwitch ListTileSwitch is a simple widget that combines ListTile with a switch. Offering 3 types of switch widgets: Switch: Material Switch fro

Fırat Çetiner 20 Nov 23, 2022
Global loading widget, which can be used through simple configuration.

load Global loading widget, which can be used through simple configuration. Pure flutter library, not use native code. It is similar to OKToast in use

Caijinglong 35 Nov 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
Flutter Carousel Pro - A Flutter Carousel widget

Carousel Extended A Flutter Carousel widget. Usage As simple as using any flutter Widget. Based on Carousel Pro but extended to be able to navigate be

omid habibi 3 Dec 7, 2020
🟥 A flutter widget that flashes when flutter fails to render a frame in a certain timeframe

?? A flutter widget that flashes when flutter fails to render a frame in a certain timeframe

Andrei Lesnitsky 32 Oct 8, 2022
React hooks for Flutter. Hooks are a new kind of object that manages a Widget life-cycles. They are used to increase code sharing between widgets and as a complete replacement for StatefulWidget.

English | Português Flutter Hooks A Flutter implementation of React hooks: https://medium.com/@dan_abramov/making-sense-of-react-hooks-fdbde8803889 Ho

Remi Rousselet 2.6k Dec 29, 2022