xuelongqy/flutter_easy_refresh
68.0
Adequate · 23 September 2026
16.8k
lines of production code
Dart
primary language
5
measurements over time
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.