Skip to content
CAI
Software that uses CAICheck a score

xuelongqy/flutter_easy_refresh

68.0

Adequate · 23 September 2026

16.8k

lines of production code

Dart

primary language

5

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a modular Flutter library for implementing pull-to-refresh and infinite-load-more interactions in scrollable views. It provides a core refresher widget alongside a collection of standalone packages offering animated indicators powered by Rive, such as Bubbles, Halloween, and Space. The library also includes a dedicated pagination component and supports secondary header interactions, with comprehensive examples demonstrating responsive layouts and multi-platform compatibility.

How it got here

2018 — Flutter V2 migration and monorepo consolidation

11 changes.

The project underwent a significant modernization by migrating the example apps to Flutter V2 embedding, upgrading to Dart 3.5+ and Flutter 3.10+, and consolidating the codebase into a multi-package workspace. This period also involved removing legacy library components and generated localization files while restructuring the example app to use GetX and responsive UI patterns.

2019–2022 — Example app expansion and platform support

11 changes.

This period focused on significantly expanding the example application with comprehensive documentation pages for advanced EasyRefresh patterns and diverse indicator styles. It also involved adding full macOS and Windows desktop support, implementing centralized routing, and enhancing the app with localization, theme switching, and custom icon rendering.

2026 — Rive animations and modularization

8 changes.

The project expanded its visual capabilities by introducing multiple Rive-powered pull-to-refresh indicators and a dedicated space-themed indicator. Concurrently, the core library was restructured to improve cross-platform support and expose new controller methods, while pagination logic was extracted into a standalone package.

Features

Add Bow pull-to-refresh indicator

This package introduces a new BowHeader and BowFooter for EasyRefresh, providing a pull-to-refresh and load-more experience driven by a Rive animation. Users can integrate these widgets to replace standard indicators with the animated bow style.

_packages/easy\_refresh\bow · high confidence

Add PathIcons class with SVG path data for Alipay, WeChat, GitHub, and Dart

The example app now includes a new \PathIcons\ class in \example/lib/widget/icon/path\_icons.dart\ that provides static SVG path data for four specific icons: Alipay, WeChat, GitHub, and Dart. This allows the example application to render these specific brand icons using raw path geometry rather than relying on external icon fonts or asset files.

example/lib/widget/icon · high confidence

Add Space Indicator with Rive animations for EasyRefresh

Introduces SpaceHeader and SpaceFooter widgets that replace standard refresh/load indicators with animated space-themed visuals powered by Rive. The indicator responds to pull gestures by updating a Rive state machine, providing visual feedback during drag, ready, and processing states for both header and footer refresh actions.

_packages/easy\_refresh\space · high confidence

Add cryptocurrency asset icons

The example assets now include SVG icon images for several cryptocurrencies, including Bitcoin, BNB, Dogecoin, Ethereum, Matic, TRX, USDC, and USDT, as well as a generic 'more' icon. These assets are available in the \example/assets/image/cryptocurrency/\ directory for use in the application's UI.

example/assets · high confidence

Add home page with tabbed navigation

The example app now includes a main home page that provides tabbed navigation between the Sample, Style, and More sections using a PageView and BottomNavigationBar.

example/lib/page · high confidence

Added English and Simplified Chinese translations for the example app

The example app now supports localization for English and Simplified Chinese. A new translation infrastructure has been added, including a central \AppTranslations\ class that registers supported locales (\en\ and \zh\_CN\) with English as the fallback. The actual translation strings cover UI elements for various indicators (such as Bezier, Classic, and Bubbles), page titles (like Chat, Theme Switch, and Paging), and user interaction messages (such as pull-to-refresh states and donation options).

example/lib/l10n · high confidence

Added Windows Flutter build configuration and plugin registration

The example application now supports building on Windows by introducing the necessary Flutter engine integration files. This includes a CMake build script that configures the Flutter library and C++ client wrappers, alongside generated plugin registrant files that automatically register the \rive\_native\ and \url\_launcher\_windows\ plugins for the Windows platform.

example/windows/flutter · high confidence

Added Windows runner for the example application

The example application now includes a native Windows runner, enabling users to build and run the app on Windows desktop. This change adds the necessary CMake build configuration, C++ source files for the Win32 window and Flutter view controller, and resource files (manifest, icon, version info) to support the platform.

example/windows/runner · high confidence

Added utility for generating contrasting text colors

A new ColorUtils helper class has been added to the example application's utility library. It provides methods to generate a deterministic background color from a string input and automatically calculates a contrasting foreground color (black or white) based on the background's luminance, ensuring readability for text displayed on those backgrounds.

example/lib/util · high confidence

EasyRefresh library restructured with new core components and scroll behavior

The EasyRefresh package has been reorganized into a modular structure, introducing a new \ERScrollBehavior\ to improve support for web and desktop platforms by handling scrollbars and pointer devices. The core \EasyRefresh\ widget now exposes a \scrollBehaviorBuilder\ for customization, and the \EasyRefreshController\ has been expanded with new methods (\openHeaderSecondary\, \closeHeaderSecondary\, \openFooterSecondary\, \closeFooterSecondary\) to programmatically control secondary indicator states. Additionally, \HeaderLocator\ and \FooterLocator\ widgets were added to allow indicators to be positioned directly within the scroll view content, and the \IndicatorState\ class was updated to include \viewportDimension\ for better layout calculations.

_packages/easy\refresh/lib · high confidence

Introduce standalone easy\_paging package with pagination widgets

The \easy\_paging\ package is now available as a standalone library, extracting the \EasyPaging\ widget and its associated state management from the main \easy\_refresh\ package. This provides developers with dedicated pagination widgets that automatically integrate with the \EasyRefresh\ refresh and load lifecycle, handling \isNoMore\ calculations based on total items or page counts, and supporting optional locator-mode slivers through underlying indicators. The package includes comprehensive tests and example implementations to demonstrate usage.

_packages/easy\paging · high confidence

New Rive-powered pull-to-refresh indicators

This release introduces four new animated pull-to-refresh indicators for the EasyRefresh library: Bubbles, Halloween, Skating, and Squats. Each indicator is provided as a standalone package (easy\_refresh\_bubbles, easy\_refresh\_halloween, easy\_refresh\_skating, easy\_refresh\_squats) and implements custom Rive animations for the header and footer states. Users can now integrate these specific visual styles by adding the corresponding package dependency and using the provided Header and Footer widgets (e.g., BubblesHeader, HalloweenFooter) within their EasyRefresh configuration.

(repo-wide) · high confidence

New example app navigation structure

The example application now includes a centralized routing configuration in \example/lib/config/routes.dart\. This file defines the URL paths and page mappings for the app's navigation, covering the home screen, various sample pages (such as profile, carousel, and paging), multiple style indicator demos (including bezier, phoenix, and bubbles), and additional utility pages like theme switching and cryptocurrency info.

example/lib/config · high confidence

New example pages for additional pull-to-refresh indicator styles

The example app now includes dedicated pages to demonstrate several new pull-to-refresh indicator styles: Bezier, BezierCircle, Bow, Bubbles, Delivery, Halloween, Phoenix, Skating, Space, and Squats. These pages showcase the visual appearance and behavior of these indicators within the EasyRefresh library, providing users with interactive examples of how to implement and customize these specific styles in their own applications.

example/lib/page/style · high confidence

New example pages for theme switching, cryptocurrency donations, and support options

The example app now includes several new pages in the 'More' section. Users can switch between system, light, dark, and various color-themed UI modes via the new ThemePage. A new SupportMePage allows users to star the repository, like on Pub, or donate via Alipay, WeChat, or cryptocurrency. The CryptocurrencyPage displays donation addresses and QR codes for Ethereum, Tron, Bitcoin, and Dogecoin. These pages are accessible through the updated MorePage navigation.

example/lib/page/more · high confidence

New example widgets for list items, bottom bar, SVG paths, and skeletons

The example app now includes four new reusable widget components in the \example/lib/widget\ directory: \ListItem\ (a customizable list tile with support for icons, SVG paths, and dividers), \MenuBottomBar\ (an expandable bottom card with refresh/load actions and animation), \PathsPaint\ (a widget for rendering SVG path strings with scaling and multi-color support), and \SkeletonItem\ (a loading placeholder widget that adapts to vertical or horizontal layouts). These additions enhance the demo's UI capabilities and provide reusable patterns for list-based interfaces and loading states.

example/lib/widget · high confidence

New sample pages for advanced EasyRefresh patterns

The example app now includes dedicated sample pages demonstrating new and enhanced EasyRefresh capabilities: CarouselPage for nested scrollable carousels, ChatPage for chat-style message lists, ListenerHeaderPage for custom header state listening, NestedScrollViewPage and TabBarViewPage for complex nested scrolling with tabs, PageViewPage for swipeable pages, PagingPage for the new EasyPaging widget, RefreshOnStartPage for auto-refreshing on load, SecondaryPage for secondary header interactions, and SamplePage as the navigation hub. These samples illustrate how to use features like nested scroll views, custom listeners, paging, and secondary headers in real-world scenarios.

example/lib/page/sample · high confidence

macOS platform support added to the example app

The example application now includes a complete macOS target, enabling users to build and run the Flutter app on macOS. This change adds the necessary Xcode project structure, including the Runner target, app icons, and localization files for Simplified Chinese, Traditional Chinese (HK), and Traditional Chinese (TW). It also configures CocoaPods for dependency management and registers native plugins such as rive\_native and url\_launcher\_macos to ensure platform-specific features function correctly on the desktop.

example/macos, example/web · high confidence

Removals

Removal of legacy EasyRefresh refresher implementation

The legacy \EasyRefresh\ widget and its associated state management logic, including custom scroll physics and animation controllers for pull-to-refresh and load-more behaviors, have been removed from the library source. This deletion eliminates the deprecated refresher component that previously handled header/footer views and scroll state callbacks directly within the \refresher.dart\ file.

lib/src · high confidence

Behavioural changes

Example app migrated to Flutter V2 embedding and updated build configuration

The Android example app has been updated to use the Flutter V2 embedding, which changes the application lifecycle and requires the new MainActivity implementation in Kotlin. This migration includes updating the AndroidManifest to declare the activity as exported, adding necessary queries for text processing, and switching to the NormalTheme for post-launch UI. Additionally, the app's package name has been updated to com.codiss.easy.refresh.example, the app label is now "EasyRefresh", and the Gradle wrapper has been upgraded from version 4.10.2 to 8.13 to support modern build requirements.

example/android · high confidence

Example app migrated to easy\_refresh with GetX localization and responsive UI

The example application has been updated to use the renamed \easy\_refresh\ package (importing \package:easy\_refresh/easy\_refresh.dart\ instead of \flutter\_easyrefresh\). It now utilizes GetX for state management and internationalization, replacing the previous manual string handling with \flutter\_localizations\ and ARB translation files for English and Chinese. The UI has been significantly restructured to support responsive layouts, allowing users to toggle between a mobile-style framed view and a full-screen desktop layout, and includes initialization for Rive animations.

example/lib · high confidence

Library entry point file removed

The main library entry point file \lib/easy\_refresh.dart\ has been deleted. This file previously served as the primary import path for the package, exporting the core \refresher.dart\ module. Users relying on this specific import path will need to update their imports to the new package structure.

lib · high confidence

Removal of generated English localization file

The auto-generated \lib/generated/i18n.dart\ file, which provided English language support and localization delegates for the application, has been deleted. This change removes the built-in English string resources and the associated \LocalizationsDelegate\ infrastructure from this specific generated file, likely as part of a broader refactoring or migration of internationalization handling.

lib/generated, res · high confidence

iOS example app upgraded to modern Xcode and Flutter tooling standards

The iOS example project has been migrated to support modern iOS development practices, including the adoption of the SceneDelegate for lifecycle management and the removal of the deprecated MinimumOSVersion constraint. It now integrates CocoaPods for dependency management, utilizes the FlutterGeneratedPluginSwiftPackage for plugin registration, and adds Chinese (zh-Hans) localization support. Additionally, the app bundle name was changed to 'EasyRefresh', and Xcode scheme settings were updated to enable GPU validation and LLDB integration for improved debugging.

example/ios · high confidence

Fixes

Generated Swift plugin package file created

A new generated Swift source file (FlutterGeneratedPluginSwiftPackage.swift) has been added to the example iOS Flutter ephemeral packages directory. This file is an auto-generated placeholder indicating the presence of a generated plugin package, with no functional code changes.

example/ios/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage · low confidence

Test coverage

Added code coverage report for easy\_refresh package; Added comprehensive widget tests for EasyRefresh indicators and controllers; Removed default widget smoke test; Updated widget test to remove MyApp dependency.

Dependencies

Migrate to Dart 3.5+ and Flutter 3.10+ with multi-package workspace

The project has been upgraded to require Dart SDK \>=3.5.0 and Flutter \>=3.10.0, enabling modern language features and framework capabilities. The monorepo structure is now managed via a Dart workspace, consolidating the core \easy\_refresh\ library, the \easy\_paging\ pagination widget, and several Rive-based indicator packages (\easy\_refresh\_bow\, \easy\_refresh\_bubbles\, \easy\_refresh\_halloween\, \easy\_refresh\_skating\, \easy\_refresh\_space\, \easy\_refresh\_squats\) under a single build system. The example app has been updated to use these new packages, upgraded to \rive\ ^0.14.4, and migrated to the modern Android Gradle plugin (AGP 8.9.1) with Java 17 and AndroidX. Additionally, the \flutter\_lints\ dependency has been updated to version 6.0.0 across the workspace.

(dependencies) · 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 68.

Lenses

  • Code Health 85
  • Architecture 99
  • Maturity 60
  • Readiness 58
  • Security 96
  • Domain Modelling 100

Changes since last survey

  • 300 commits — 199 feature/other, 101 fixes

By area

  • lib/src — 78 commits
  • (root) — 75 commits
  • example/lib — 63 commits
  • (repo) — 20 commits
  • example/windows — 10 commits
  • example/android — 9 commits
  • packages/easy_refresh — 9 commits
  • .github/FUNDING.yml — 5 commits
  • example/pubspec.yaml — 5 commits
  • packages/easy_paging — 4 commits
  • example/ios — 3 commits
  • styles/easy_refresh_bubbles — 3 commits
  • .github/workflows — 2 commits
  • example/assets — 2 commits
  • example/web — 2 commits
  • packages/easy_refresh_bow — 2 commits
  • styles/easy_refresh_halloween — 2 commits
  • styles/easy_refresh_space — 2 commits
  • .agents/skills — 1 commit
  • example/.gitignore — 1 commit

Notable commits

  • fix: - fix: CupertinoActivityIndicator renamed to avoid conflicts.
  • fix: - fix: EasyPaging.itemBuilder type inference (https://github.com/xuelongqy/flutter_easy_refresh/issues/762).
  • fix: > fix: NotRefreshHeader and NotLoadFooter [position] causes tree structure changes.
  • fix: Fix error when using NotLoadFooter with clamping
  • fix: Fix footer staying visible after finishLoad
  • fix: Fix: stuck load footer after list extent change; add regression tests
  • fix: Merge pull request #680 from AWarmHug/bugfix
  • fix: fix bug
  • fix: fix(ListenerHeaderPage): RefreshProgressIndicator value.
  • fix: fix(example): update Android build setup for Flutter 3.41
  • fix: fix: .pubignore
  • fix: fix: Add OverrideFooter and OverrideHeader.
  • fix: fix: Adjust ClassicIndicator icon.
  • fix: fix: Adjust DeliveryIndicator.
  • fix: fix: Adjust TaurusIndicator.
  • fix: fix: Adjust the Flutter version, Flutter >=3.10.0.
  • fix: fix: All styles are lost.
  • fix: fix: Avoid an endless loop caused by multiple ListViews nested.
  • fix: fix: BezierCircleHeader drop overflow.
  • fix: fix: BezierIndicator.spinBuilder doesn't work.
  • …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

xuelongqy/flutter_easy_refresh 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 23 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 de53826b004c486b2f176f49cf624d5c2ab45c17 — 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-955b9cee9818.