Skip to content
CAI
Software that uses CAICheck a score

fluttercandies/extended_image

56.2

Weak · 19 September 2026

67.8k

lines of production code

Dart

primary language

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

This system is a Flutter library for advanced image handling, providing capabilities for caching, gesture-based viewing, and editing. It features a dedicated image editor for cropping and rotating, along with a custom page view that resolves gesture conflicts between scrolling and zooming. The package includes a comprehensive example app demonstrating these features across mobile and web platforms.

How it got here

2019 — v10.1.0 modernization and example overhaul

15 changes.

The project underwent a major version update to 10.1.0, modernizing the dependency tree and refactoring core gesture handling and library exports for improved modularity. Concurrently, the example application was completely restructured to align with current Flutter and Android/iOS standards, incorporating code-generated routing and updated build configurations.

2020 — Example app web support and demo expansion

8 changes.

The example application was expanded to support the web platform, introducing dedicated image picking and saving logic alongside PWA configuration. A comprehensive suite of new demo pages and UI widgets was added to showcase image editing, caching, gesture handling, and memory management features.

2021–2023 — image editing and gesture subsystems

8 changes.

This period focused on building a dedicated image editing subsystem with robust cropping, rotation, and state management capabilities. It also introduced advanced gesture handling components to resolve conflicts between image zooming, panning, and page scrolling, while fixing layout issues in the page view.

Features

Add image editing, utility, and memory monitoring helpers to the example app

The example app now includes three new utility files in \example/lib/common/utils\ to support its image editing demo. \crop\_editor\_helper.dart\ provides logic for cropping, rotating, flipping, and encoding images (including GIF support) using both Dart and native libraries, handling coordinate adjustments for resized images. \util.dart\ adds helper functions for calculating initial image scales and saving network images to the device's photo library. \vm\_helper.dart\ introduces a memory monitoring tool that connects to the Dart VM service to track and display heap usage and external memory in debug mode.

example/lib/common/utils · high confidence

Add preloadPagesCount parameter to GesturePageView

The GesturePageView widget now accepts a preloadPagesCount parameter (defaulting to 0) in its constructors, allowing users to configure how many pages are preloaded beyond the currently visible page to improve scrolling performance and reduce layout jank.

_lib/src/gesture/page\view/widgets · high confidence

Add web platform support for the example app

The example application now supports running on the web platform. This change introduces the necessary entry point (\index.html\), web manifest (\manifest.json\) for PWA configuration, and a JavaScript helper (\save\_web\_plugin.js\) to enable file-saving functionality in the browser environment.

example/web · high confidence

Added TuChong data source and repository for the example app

The example application now includes a new data layer for the TuChong platform, introducing \TuChongRepository\ to handle list loading and pagination, \TuChongSource\ for JSON parsing, and \mock\_data.dart\ to provide offline fallback data. This implementation supports web environments by switching between live API calls and local mock data, and includes a \PicSwiperItem\ model to support image display within the example.

example/lib/common/data · high confidence

Added iOS Flutter configuration files for the example app

The example iOS project now includes the standard Flutter configuration files: AppFrameworkInfo.plist (setting the minimum OS version to 12.0), Debug.xcconfig, and Release.xcconfig. These files establish the necessary build settings and CocoaPods integration for the iOS example target.

example/ios/Flutter · high confidence

Introduce dedicated image editor components and controller

This change introduces a new, dedicated image editing subsystem within the \lib/src/editor\ directory, replacing or supplementing previous ad-hoc editing logic. It adds \ExtendedImageEditor\ as the main widget, \EditorConfig\ for customizing crop behavior (aspect ratios, padding, hit-test sizes, animations), and \ImageEditorController\ for programmatic control (rotate, flip, undo, redo, save state). The diff also includes the supporting infrastructure: \EditActionDetails\ to track transformation state (scale, rotation, crop rect), \ExtendedImageCropLayer\ and \EditorCropLayerPainter\ for rendering the crop overlay with corner handles and grid lines, and utility classes like \CropAspectRatios\ and \InitCropRectType\. This provides a structured, configurable, and controllable image cropping and editing experience.

lib/src/editor · high confidence

New ExtendedImageGesturePageView with granular drag control

The library introduces \ExtendedImageGesturePageView\, a page view widget designed to support image gestures. This component adds a \shouldAccpetHorizontalOrVerticalDrag\ callback, allowing users to dynamically decide whether horizontal or vertical drags should be accepted at any given moment, which helps resolve conflicts between page scrolling and image zooming/panning. It also exposes \allowImplicitScrolling\ for accessibility support and utilizes a custom \ExtendedPageController\.

_lib/src/gesture/page\view · high confidence

New complex example demos for image editing, live photos, and memory management

The example app now includes several new demonstration pages in the Complex group: an Image Editor demo showcasing crop, rotate, and flip capabilities with configurable aspect ratios and custom layer painters; a Live Photo demo that displays and plays live photos with options to control playback during gestures and page transitions; a Memory Usage demo illustrating how to reduce memory footprint using compression ratios, max bytes, and cache clearing on dispose; a Photo View demo for zooming and panning images in a social-feed-style layout; and a Waterfall Flow demo showing image loading in a masonry grid layout.

example/lib/pages/complex · high confidence

New demo app navigation structure with grouped routes

The example app now uses a new \main\_page.dart\ to display demos in a grouped list view, leveraging \ff\_annotation\_route\_library\ for route generation. The main page filters out specific internal routes and conditionally excludes memory usage demos on web, while the demo group page handles navigation to individual examples.

example/lib/pages · high confidence

New example UI widgets and demo components

The example app now includes a suite of reusable UI components and demo screens to showcase library features. This adds a custom ChangeNotifierBuilder for state-driven UI updates, a HeroWidget that improves slide-out animations by handling offset and scale transforms, and a CropImage widget for displaying and interacting with images. It also introduces a MemoryUsageView and MemoryUsageChart for visualizing heap and external memory usage via the VM service, alongside standard layout widgets like PicGridView, PicSwiper, and a PullToRefreshHeader.

example/lib/common/widget · high confidence

New gesture handling and sliding page components for image viewing

This change introduces the core implementation for the \lib/src/gesture\ module, adding \ExtendedImageGesture\ to handle image scaling, panning, and double-tap interactions, along with \ExtendedImageSlidePage\ and \ExtendedImageSlidePageHandler\ to manage full-page or image-only sliding gestures. It also includes supporting utilities in \utils.dart\ for gesture state and boundary calculations, enabling users to interact with images via touch gestures and slide transitions.

lib/src/gesture · high confidence

New simple image demo pages added to the example app

The example application now includes a new 'Simple' group of demo pages under \example/lib/pages/simple\. These new files demonstrate core ExtendedImage capabilities: custom load states with fade transitions and retry logic (\custom\_image\_demo.dart\), image caching with border and shape styling (\image\_demo.dart\), image cropping via the editor mode (\image\_editor\_demo.dart\), loading progress indicators (\loading\_progress.dart\), canvas painting before/after image rendering (\paint\_image\_demo.dart\), and gesture-based photo viewing with \ExtendedImageGesturePageView\ and slide-out page animations (\photo\_view\_demo.dart\, \simple\_photo\_view\_demo.dart\, \slide\_page\_demo.dart\, \zoom\_image\_demo.dart\).

example/lib/pages/simple · high confidence

iOS example project now includes unit test target

The iOS example application (Runner) has been updated to include a dedicated unit test target named RunnerTests. This change adds the necessary Xcode project configuration to build and run unit tests alongside the main application, integrating the test bundle into the workspace.

example/ios/Runner.xcodeproj · high confidence

Behavioural changes

Added Xcode scheme configuration for the iOS example app

The iOS example app now includes a committed Xcode scheme file (Runner.xcscheme) that defines build, test, launch, profile, analyze, and archive actions. This ensures consistent project configuration for developers and CI systems, enabling features like GPU validation mode during launch and parallelizable test execution.

example/ios/Runner.xcodeproj/xcshareddata · high confidence

Android example app scaffolded with required permissions and standard Flutter configuration

The Android portion of the example app has been initialized with a standard Flutter project structure. This includes adding the INTERNET permission to the debug and profile manifests (required for hot reload and debugging), and configuring the main manifest with permissions for external storage and media access (READ\_EXTERNAL\_STORAGE, WRITE\_EXTERNAL\_STORAGE, READ\_MEDIA\_IMAGES, READ\_MEDIA\_VIDEO) to support image and video handling. The app is configured to use the Flutter V2 embedding, includes a MainActivity extending FlutterActivity, and sets up standard light and dark theme launch backgrounds.

example/android · high confidence

Example app restructured with generated routing and asset management

The example application has been refactored to use code generation for navigation and asset handling. Routing is now managed by \ff\_annotation\_route\, which generates \example\_route.dart\ and \example\_routes.dart\ to define and resolve demo pages (such as Image Editor, Live Photo, and Waterfall Flow) via a centralized \getRouteSettings\ switch. Asset access is standardized through a generated \Assets\ class in \assets.dart\, providing type-safe constants for images and media. The \main.dart\ entry point has been updated to initialize the \OKToast\ library, configure web-specific scroll behaviors, and wire the generated routes into the \MaterialApp\.

example/lib · high confidence

Example app text components commented out

The example application's custom text handling components (AtText, DollarText, EmojiText, MySpecialTextSpanBuilder, and MyExtendedTextSelectionControls) have been commented out, effectively disabling the demonstration of special text spans and custom text selection controls in the example app.

example/lib/common/text · high confidence

Example project configuration and scaffolding updates

The example application has been updated with new configuration files to support modern development workflows. A \.gitignore\ file is added to exclude build artifacts and IDE-specific files. An \analysis\_options.yaml\ file is introduced to configure static analysis, excluding mock data and disabling the \avoid\_print\ rule. Additionally, \devtools\_options.yaml\ is added to configure Dart & Flutter DevTools extensions, and new files \assets\_generator\_arguments\ and \ff\_annotation\_route\_commands\ are created to define arguments for asset generation and route annotation tools respectively.

example · high confidence

Improved gesture disambiguation for zoom and drag interactions

The library now resolves conflicts between scale (zoom) gestures and horizontal/vertical drags by introducing custom drag recognizers (\ExtendedHorizontalDragGestureRecognizer\ and \ExtendedVerticalDragGestureRecognizer\) that analyze velocity tracker data to determine gesture intent. Users can now explicitly control this behavior via the \canHorizontalOrVerticalDrag\ and \shouldAccpetHorizontalOrVerticalDrag\ callbacks, allowing for smoother zooming in \ExtendedImageGesturePageView\ and preventing unintended drag acceptance during multi-pointer zoom operations.

_lib/src/gesture\detector · high confidence

Introduces layout insets and image editing hooks to the image rendering pipeline

The image rendering layer in \lib/src/image\ has been refactored to support layout insets and integration with the image editor. A new \layoutInsets\ property allows developers to define insets that affect the image's layout and painting bounds without changing the painted area, while new \editActionDetails\ and \gestureDetails\ parameters enable the \ExtendedRenderImage\ and \paintExtendedImage\ to respond to editor state and gesture information. Additionally, the \ExtendedRawImage\ widget now accepts these details along with \sourceRect\ for cropping, \opacity\ animations, and \isAntiAlias\ for smoother rotated images, providing the foundation for the editor's rotation and cropping features.

lib/src/image · high confidence

Library exports reorganized to include image editor and gesture components

The main library entry point has been restructured to explicitly export the new image editor module (including editor, config, and crop layer painter) and the gesture handling module (including gesture page view, slide page, and utils), while removing direct exports of older network image utilities and raw image components in favor of a more modular structure.

lib · high confidence

Platform-specific image picker and saver implementations added

The example application now includes dedicated image picking and saving logic for both mobile and web platforms. On mobile (IO), it utilizes the \wechat\_assets\_picker\ package to select images and \photo\_manager\ to save them, replacing previous implementations. For web, a new implementation uses \dart:js\_interop\ and the \package:web\ library to handle file selection via HTML input elements and saving via JavaScript exports. A unified \image\_picker.dart\ entry point exports the appropriate platform-specific implementation based on the target environment.

_example/lib/common/image\picker · high confidence

Refactor gesture handling and page view architecture

The library has been refactored to improve gesture conflict resolution between scaling and dragging, particularly within page views. A new \ExtendedPageController\ and \ExtendedPagePosition\ have been introduced to manage page spacing and pointer event handling during scrolling, allowing for smoother interactions when zooming images inside a \PageView\. The internal network image provider and caching logic have been removed in favor of a more modular structure, and the \BorderPainter\ has been renamed and updated to \ExtendedImageBorderPainter\ with improved painting logic. These changes streamline the core gesture and layout mechanisms, enhancing the stability of image editing and viewing experiences.

lib/src · high confidence

Removal of legacy Android build artifacts

The Android module no longer includes the auto-generated \GeneratedPluginRegistrant.java\ file or the \local.properties\ file. This removes hardcoded local SDK paths and the manual registration of the \ImagePickerSaverPlugin\ and \PathProviderPlugin\, indicating a shift to a build system that handles plugin registration and SDK location resolution automatically.

android · high confidence

iOS example app scaffold updated for modern Flutter standards

The iOS example application has been regenerated to include a standard iOS project structure, featuring a new Swift-based AppDelegate, updated Info.plist with modern settings (such as Impeller disabled and indirect input support), and refreshed storyboard and asset configurations. This ensures the example app builds and runs correctly on current iOS versions using the latest Flutter iOS integration patterns.

example/ios/Runner · high confidence

iOS workspace configuration files added

The iOS example project now includes standard Xcode workspace configuration files: IDEWorkspaceChecks.plist and WorkspaceSettings.xcsettings. These files ensure consistent workspace behavior by enabling the 32-bit warning check and disabling the Previews feature, providing a stable development environment for the iOS demo app.

example/ios/Runner.xcodeproj/project.xcworkspace, example/ios/Runner.xcworkspace/xcshareddata · high confidence

Fixes

Fix pageSpacing layout in PageView after Flutter 3.22.0

The \pageSpacing\ property in \PageView\ now correctly applies spacing between pages. This change updates the internal rendering logic in \sliver\_fill.dart\ to account for spacing during layout calculations, resolving an issue where spacing was ignored in Flutter versions 3.22.0 and later.

_lib/src/gesture/page\view/rendering · high confidence

Test coverage

Added iOS unit test scaffold for the Runner app

Added a new XCTest file (RunnerTests.swift) in the iOS example project to provide a starting point for unit testing the native iOS runner. The file includes a basic test class and a placeholder test method, allowing developers to add specific tests for the iOS application logic as needed.

example/ios/RunnerTests · high confidence

Dependencies

Extended Image v10.1.0: Major SDK and dependency overhaul

The package has been updated to version 10.1.0, raising the minimum supported versions to Dart 3.7.0 and Flutter 3.29.0. This release significantly simplifies the dependency tree by removing legacy packages (path\_provider, http\_client\_helper, crypto, image\_picker\_saver, transparent\_image) and replacing them with modern, minimal dependencies (extended\_image\_library ^5.0.0, meta ^1.7.0, vector\_math ^2.1.4). The example application has also been migrated to the new Flutter Gradle plugin (Kotlin DSL) and updated to use Android Gradle Plugin 8.13.0 and Kotlin 2.2.0.

(dependencies) · high confidence

Updated Android Gradle wrapper to version 8.14.3

The Android example project now uses Gradle wrapper version 8.14.3, ensuring that builds are executed with this specific distribution. This change standardizes the build environment for the example app and may affect build times or compatibility with existing local Gradle installations.

example/android/gradle · high confidence

Housekeeping

Repository cleanup and documentation overhaul

The repository has been cleaned up by removing legacy IDE and build artifacts (such as .iml and .flutter-plugins) and updating .gitignore to exclude modern Flutter/Dart build outputs. A new .pubignore file has been added to control published package contents, and a CODEOWNERS file has been introduced to assign repository ownership. Additionally, the project documentation has been significantly expanded with a comprehensive English README and a new Chinese README (README-ZH.md), while the CHANGELOG has been updated to reflect the full version history up to 10.1.0.

(repo-wide) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Baseline

  • First survey — no prior run to compare against. CAI 56.

Lenses

  • Code Health 99
  • Architecture 72
  • Maturity 37
  • Readiness 67
  • Security 70
  • Domain Modelling 100

Changes since last survey

  • 300 commits — 240 feature/other, 60 fixes

By area

  • (root) — 100 commits
  • example/lib — 68 commits
  • (repo) — 54 commits
  • lib/src — 45 commits
  • .github/workflows — 5 commits
  • example/android — 5 commits
  • example/ios — 5 commits
  • .github/FUNDING.yml — 4 commits
  • docs/assets — 4 commits
  • docs/flutter_service_worker.js — 2 commits
  • example/windows — 2 commits
  • .github/stale.yml — 1 commit
  • .idea/libraries — 1 commit
  • example/.gitignore — 1 commit
  • example/devtools_options.yaml — 1 commit
  • example/macos — 1 commit
  • example/pubspec.yaml — 1 commit

Notable commits

  • fix: Fix issue about worng scale for crop rect when scale is more than max scale
  • fix: # 6.1.0 * Migrate to 2.13.0 * override == and hashCode for ExtendedResizeImage * fix issue that ExtendedResizeImage can't get rawImageData(#477) * ExtendedResizeImage.maxBytes is actual bytes of Image, not decode bytes. * fix issue that max scale look bigger after zoom in and zoom out (#476)
  • fix: ## 1.1.2 * Issues: Fix issue that flickering when zooming out(#235).
  • fix: ## 10.0.1 * Fix issue that Scale the image to align with the crop rect only when scaleDelta is small.(#738) * Change the color from dialogBackgroundColor to scaffoldBackgroundColor for defaultSlidePageBackgroundHandler.
  • fix: ## 4.0.1 * Issues: 1. fix issue that we should end method with a call to super.dispose().(#329).
  • fix: ## 4.2.0 * Issues: fix issue that inverse zoom by mouse wheel.(#382) fix issue that crop_layer with/height is negative
  • fix: ## 4.2.1 * Improve: fix description of reverseMousePointerScrollDirection
  • fix: ## 5.1.2 * Issues: 1. fix issue that mouse wheel/double tap are not working.(#404)
  • fix: ## 6.0.1 * Issues: Fix VelocityTracker is not type ExtendedVelocityTracker
  • fix: ## 6.3.1 * fix issue that rebuild viewportDimension is not right when pageSpacing is not zero(ExtendedImageGesturePageView #516)
  • fix: ## 9.0.9 Fix drag crop rect can't zoom in the image(#723)
  • fix: ## [0.5.9] * Add HeroBuilderForSlidingPage call back to fix strange hero animation
  • fix: ## [0.6.1] * Issues: Fix issue about drag slowly in ImageEditor
  • fix: ## [0.6.3] * Issues: Fix issue that forget canvas.restore after canvas.clipRect * Breaking Change: ImageEditor:you should crop image before flip or rotate image now.
  • fix: ## [0.6.3] * Issues: Fix issue that forget canvas.restore after canvas.clipRect * Breaking Change: ImageEditor:you should crop image data before flip or rotate image data now. * Improve: Increase cropping speed
  • fix: ## [0.6.4] * Issues: Fix issue that rawImageData can't be cached for ExtendedExactAssetImageProvider/ExtendedAssetImageProvider. * Improve: Add demo about ImageEditor with native library, it's faster.
  • fix: ## [0.7.3-dev] * Improve: fix build error on high flutter sdk(> 1.6.0) fix analysiz_options
  • fix: ## [0.7.4+1] * Issues: Fix ScrollPhysics is not working for ExtendedImageGesturePageView
  • fix: * Features: Support init image with alignment when initialScale >1.0. * Issues: Fix issue that scrollDirection didn't work when set it dynamically(ExtendedImageGesturePageView ). * Improve: Add WaterfallFlow demo.
  • fix: * Fix crop rect transform not invert * Support editor config history * Add updateConfig and get config from editor controller
  • …and 280 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

fluttercandies/extended_image was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 19 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit e1be24b133136de46b415dba97c74a0e9ac18447 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-13a154b7f5d1.