Pullex 🚀

A modern, flexible and production-ready Pull-To-Refresh & Load-More widget for Flutter.
Forked from flutter_pulltorefresh — rewritten and modernized for Flutter 3 & Dart 3 with improved architecture, localization, and full null-safety.


✨ What's New in 1.0.4

  • Improved localization and translations
  • Renamed PullexRefreshControllerRefreshController
  • Fixed all static analysis warnings (lints compliant)
  • Achieved 100% pub.dev score
  • Minor documentation and code cleanup

🔁 Migration from PullexRefreshControllerRefreshController

⚠️ Starting from v1.0.1, the old class name PullexRefreshController has been renamed to RefreshController

❌ Before

final controller = PullexRefreshController();

✅ After

final controller = RefreshController();

💡 Tip: You only need to rename the class in your imports — no API behavior has changed.


⚙️ Features

  • ✅ Modern architecture — Flutter 3.x & Dart 3 compatible
  • ✅ Ready-to-use headers:
    • BaseHeader
    • CustomHeader
    • MaterialClassicHeader
    • WaterDropHeader
    • StretchCircleHeader
    • TwoLevelHeader
  • ✅ Custom Footer support
  • ✅ LinkHeader / LinkFooter proxy support
  • ✅ Fully customizable and easy to integrate
  • ✅ 12 built-in localizations
  • ✅ Zero dependencies (pure Dart)
  • ✅ Production-ready — used in live apps

📦 Installation

Add to your pubspec.yaml:

dependencies:
  pullex: ^1.0.4

🧩 Basic Usage

import 'package:pullex/pullex.dart';

final controller = RefreshController();

SmartRefresher(
  controller: controller,
  enablePullDown: true,
  enablePullUp: true,
  header: const MaterialClassicHeader(),
  onRefresh: () async {
    // your refresh logic
    controller.refreshCompleted();
  },
  onLoading: () async {
    // your load more logic
    controller.loadComplete();
  },
  child: ListView.builder(
  itemCount: 30,
  itemBuilder: (_, i) => ListTile(title: Text('Item $i')),
  ),
);

🖼️ Examples

Base Header Custom Header Load More Base Header Material Header
Base Header Custom Header Load More Base Header Material Header
Stretch Circle Header Two Level Refresh Water Drop Header
Stretch Header Two Level Refresh Water Drop Header

🌍 Localization

Pullex supports 12 languages out of the box:

Language Code
English en
Chinese zh
French fr
Ukrainian uk
Italian it
Japanese ja
German de
Spanish es
Dutch nl
Swedish sv
Portuguese (Brazil) pt
Korean ko

Setup localization:

MaterialApp(
  localizationsDelegates: [
    RefreshLocalizations.delegate,
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate,
  ],
  supportedLocales: [
    const Locale('en'),
    const Locale('uk'),
    const Locale('fr'),
    const Locale('de'),
    const Locale('es'),
    const Locale('pt'),
    const Locale('it'),
    const Locale('nl'),
    const Locale('sv'),
    const Locale('ko'),
    const Locale('ja'),
    const Locale('zh'),
  ],
)

🚚 Migration from flutter_pulltorefresh

Pullex is a modernized fork of flutter_pulltorefresh, fully compatible with Flutter 3:

  • Cleaner and safer public API
  • Updated internal scroll physics
  • Improved headers and footers
  • Built-in localization
  • Actively maintained

📌 Example Project

You can find a complete example in:

example/lib/ui/

Each header type has a dedicated example:

ui/base_header/base_header_example.dart
ui/custom_header/custom_header_example.dart
ui/load_more_base_header/load_more_base_header_example.dart
ui/material_header/material_header_example.dart
ui/stretch_header/stretch_header_example.dart
ui/two_level_refresh/two_level_refresh_example.dart
ui/water_drop_header/water_drop_header_example.dart

Run:

flutter run -d your_device

❤️ Contributing

Contributions are welcome!
Feel free to open issues or submit PRs to improve Pullex.


📜 License

MIT License — based on flutter_pulltorefresh
by Jpeng


Pullex — built for modern Flutter 🚀
Crafted with ❤️ by Drivecode Team

Libraries

pullex