A community-driven, AI-engineered, and high-velocity continuation of GetX. High-performance reactive state, context-free routing, and intelligent dependency injectionβmodernized for the next generation of Flutter.
π The State of GetX 5.0 & The Path Forward
For years, GetX was the undisputed king of Flutter state management, beloved for decoupling business logic from views and eliminating context-dependent navigation.
However, in mid-2026, the community hit critical, unresolved roadblocks:
β‘ The Core Roadblocks
- π΄ Stalled Releases: GetX 5.0 has remained in a perpetual release-candidate loop (
release-candidate-9.3.2) for a very long time, leaving developers stranded in production with unreleased fixes. - π Breaking SDK Upgrades: Recent updates in Flutter 3.41+ & 3.44+ introduced hard compilation errors (such as the infamous
'CupertinoPageTransitionsBuilder' isn't a typebuild error) and Dart 3.12+ compatibility failures. - π‘ Critical Platform Glitches: Essential mobile routing APIs suffered from unpatched bugs:
PopScope'scanPopbehaving incorrectly, causing broken back-swipe gestures on iOS.- Route transition animations freezing mid-screen under memory load.
Get.bottomSheetflashing white and dismissing instantly on iOS devices.Get.offAllNamedleaking controller memory when routed from cold-start push notifications.
Instead of abandoning our codebases or initiating painful, costly rewrites in other state managers, we chose a better path: we built the modernization ourselves.
π Introducing getxtra
getxtra is the community-driven, active evolution of GetX. Hosted at gauravmehta13/getxtra, it is a drop-in replacement that takes the core GetX 5.0 architecture and completely modernizes it for modern Flutter.
βοΈ The Comparison: Legacy vs. getxtra
| Core Metric | Legacy GetX 5.0 RC | getxtra (Modern Edition) |
|---|---|---|
| Flutter 3.44+ / SDK compatibility | β Fails (Compile Errors) | π’ Fully Supported & Stable |
| Dart 3.12+ Null Safety & Standards | β Outdated warnings | π’ 100% Compliant & Warnings-free |
| iOS Swipe Navigation Interception | β Broken / Freezes | π’ Re-engineered, smooth swipe gestures |
| iOS Dynamic Bottom Sheets | β Visual flashing bug | π’ Solid, native-rendered animations |
| Cold Notification Routing | β Memory leaks controllers | π’ Clean lifecycles, precise DI cleanup |
| Publishing & Maintenance | β Stalled for years | π’ Community-run, ultra-high velocity |
π Project Blueprint & Goals
- Preserve the API You Love: Built directly on top of the GetX 5.0 codebase. Your imports and basic syntax remain unchanged. The transition is designed to be a drop-in replacement.
- Modernized Environment: Ready out-of-the-box for Dart 3.12+ and Flutter 3.44+. No more build-breaking Cupertino transition errors or deprecation warnings.
- Targeted Bug Fixes: We have already addressed the core issues plaguing GetX 5.0:
- Fixed
PopScope/canPopnavigation interceptors. - Resolved frozen route transition animations.
- Fixed iOS bottom sheet flashing and auto-dismissal.
- Corrected controller lifecycle management and routing edge cases for push notifications in
Get.offAllNamed.
- Fixed
π€ Powered by AI-Driven Development
Maintaining a full-scale reactive framework is a massive undertaking. To achieve unmatched velocity and safety, getxtra is developed using a cutting-edge approach: AI-Driven Development.
We leverage advanced AI models to accelerate framework maintenance:
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π΄ Community Issue Filed & Bug Tracked β
ββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π AI-Assisted Triage & Precise Bug Localization β
ββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π§ͺ Automated Regression & Edge-Case Test Harnesses β
ββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β‘ Safe AI-Guided Refactoring & Auto-Migration β
ββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β βοΈ Continuous Integration & Multi-Platform Validation β
ββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π Rapid Production-Ready Stable Release (Hours!) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Instant Issue Triaging: Automatically maps user-reported bugs to exact source code coordinates.
- Automated Test Harnesses: Writes comprehensive unit and integration tests to secure iOS/Android gestures and platform lifecycles.
- Safe Refactoring: Automatically upgrades deprecated SDK hooks, preventing regressions and maintaining optimal performance.
Our AI-driven workflow translates to shipping robust, verified updates in hours instead of months.
π± The Fate of getxtra is Community-Driven
We want to be completely transparent: this projectβs survival depends entirely on you.
- If the community shows strong engagementβby starring the repository, filing issues, providing feedback, and contributing pull requestsβwe will actively maintain
getxtra, publish regular pub.dev updates, and keep it synchronized with future Flutter releases. - If interest is low, it will remain a custom internal utility for our own production apps and will not be actively maintained for the public.
If you want a stable, modernized, and actively maintained version of GetX, we need your voice (and your stars)!
π οΈ How to Migrate & Get Started
Transitioning your app is exceptionally simple.
1. Update pubspec.yaml
Point your dependency directly to our community repository:
# β pubspec.yaml
dependencies:
getxtra:
git:
url: https://github.com/gauravmehta13/getxtra.git
ref: master
2. Update Import Statements
Replace any standard get references in your code:
// β main.dart
import 'package:getxtra/get.dart';
π The Counter App: Power in 26 Lines
With getxtra, you separate your business logic from UI rendering cleanly, without stateful widgets or heavy boilerplate, in just 26 lines of code:
// β main.dart
import 'package:flutter/material.dart';
import 'package:getxtra/get.dart';
void main() => runApp(GetMaterialApp(home: Home()));
class Controller extends GetxController {
var count = 0.obs;
increment() => count++;
}
class Home extends StatelessWidget {
@override
Widget build(context) {
// Instantiate your controller and make it available to descendant routes
final Controller c = Get.put(Controller());
return Scaffold(
appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))),
body: Center(
child: ElevatedButton(
child: Text("Go to Other Screen"),
onPressed: () => Get.to(Other())
)
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: c.increment
),
);
}
}
class Other extends StatelessWidget {
// Retrieve the existing controller instance automatically
final Controller c = Get.find();
@override
Widget build(context) => Scaffold(body: Center(child: Text("Count: ${c.count}")));
}
π Complete API & Features Guide
Click a category below to explore getxtra's highly optimized core systems.
β‘ Pillar 1: High-Performance State Management
1. Reactive State Manager (Rx & Obx)
Reactive programming with getxtra completely removes streams, StreamControllers, and code generators.
Simply append .obs to make any variable observable:
// β controller.dart
var name = 'Jonatas Borges'.obs;
var count = 0.obs;
var userList = <User>[].obs;
In the UI, wrap your widget in Obx. It will rebuild only when the specific observed values change:
// β view.dart
Obx(() => Text("Hello, ${controller.name}"));
2. Simple State Manager (GetBuilder)
For ultra-lightweight, high-performance UI updates with zero stream overhead and negligible memory footprint, use GetBuilder.
// β controller.dart
class Controller extends GetxController {
int counter = 0;
void increment() {
counter++;
update(); // Notifies and rebuilds listening GetBuilder widgets
}
}
// β view.dart
GetBuilder<Controller>(
init: Controller(), // Instantiates the controller
builder: (value) => Text('Count: ${value.counter}'),
)
Tip
GetxController merges RxController and GetBuilder functionality. You can mix and match simple and reactive states inside the same class!
π£οΈ Pillar 2: Context-Free Route Management
getxtra completely decouples navigation from the widget tree. Open snackbars, pop screens, and navigate to routes without ever passing a BuildContext.
1. Initialization
Simply swap your core MaterialApp widget for GetMaterialApp:
// β main.dart
GetMaterialApp(
home: MyHome(),
)
2. Navigation Control APIs
- Navigate to a new page widget:
Get.to(NextScreen()); - Navigate via Named Route:
Get.toNamed('/details'); - Close dialogs, snackbars, bottom sheets, or pop the route:
Get.back(); - Navigate to a new screen and remove the immediate previous route (e.g., Splash to Login):
Get.off(NextScreen()); - Navigate to a new screen and clear the entire navigation history stack (e.g., Login to Dashboard):
Get.offAll(NextScreen());
3. Advanced Navigation
// Navigate and clean up history until a specific condition matches
Get.offUntil(DashboardScreen(), (route) => route.isFirst);
// Named routing equivalent
Get.offNamedUntil('/dashboard', (route) => route.isFirst);
// Manually remove a specific route from stack
Get.removeRoute(targetRoute);
π¦ Pillar 3: Intelligent Dependency Injection
A highly optimized service locator is built directly into getxtra. Skip heavy architectures and retrieve logic files instantly.
1. Register a Dependency
Save a class instance inside the global memory space:
Controller controller = Get.put(Controller());
2. Retrieve the Dependency
Recover the registered instance from anywhere in your codebase:
Controller controller = Get.find();
3. Automated Lifecycle & Cleanup
getxtra is designed to be highly memory-efficient. When a screen is popped, its associated controller is automatically garbage-collected and disposed.
- Keep dependency persistent: Pass
permanent: trueto prevent automatic teardown:Get.put(Controller(), permanent: true); - Lazy Loading: Load the class into memory only when it is actually called by
Get.find():Get.lazyPut<Service>(() => ServiceImpl());
π Internationalization & Localization Engine
Manage translations with ease using lightweight key-value dictionary maps.
1. Configure Custom Translations
Extend the Translations class to setup multiple locales:
// β translations.dart
import 'package:getxtra/get.dart';
class Messages extends Translations {
@override
Map<String, Map<String, String>> get keys => {
'en_US': {
'hello': 'Hello World',
'logged_in': 'Logged in as @name',
},
'de_DE': {
'hello': 'Hallo Welt',
'logged_in': 'Eingeloggt als @name',
}
};
}
2. Output Translations in UI
- Basic Translation:
Text('hello'.tr); - With Parameters:
Text('logged_in'.trParams({'name': 'Gaurav'})); - With Plurals:
Text('singularKey'.trPlural('pluralKey', itemCount, args));
3. Localization Settings
Configure GetMaterialApp with your translation maps:
GetMaterialApp(
translations: Messages(),
locale: Locale('en', 'US'),
fallbackLocale: Locale('en', 'UK'),
)
Change active locales dynamically:
var locale = Locale('de', 'DE');
Get.updateLocale(locale); // All UI widgets using .tr rebuild instantly!
π¨ Theme & Responsive Context Extensions
Update dark/light themes instantly without boilerplate ThemeProviders or duplicate keys.
1. Dynamic Theme Controls
- Switch to a custom theme:
Get.changeTheme(ThemeData.light()); - Dark/Light Mode toggling:
Get.changeTheme(Get.isDarkMode ? ThemeData.light() : ThemeData.dark());
2. Rich Layout & Dimension Context Extensions
getxtra provides robust, high-performance extensions to read screen properties quickly:
// Immutable dimensions
Get.height // Double screen height
Get.width // Double screen width
// Context-aware responsive mappings
context.responsiveValue<T>(
watch: watchVal,
mobile: mobileVal,
tablet: tabletVal,
desktop: desktopVal,
)
// Structural platform checks
context.isPhone()
context.isTablet()
context.isLandscape()
π GetConnect: REST Client & WebSockets
An ultra-light REST client and WebSocket architecture that bypasses heavy network package dependencies.
1. Standard API Setup
// β api_provider.dart
class UserProvider extends GetConnect {
// GET request
Future<Response> getUser(int id) => get('http://api.com/users/$id');
// POST request
Future<Response> postUser(Map data) => post('http://api.com/users', body: data);
// File Upload
Future<Response> uploadAvatar(List<int> image) {
final form = FormData({
'file': MultipartFile(image, filename: 'avatar.png'),
});
return post('http://api.com/users/upload', form);
}
}
2. High-End Customization (Interceptors & Retries)
// β api_provider.dart
class AdvancedProvider extends GetConnect {
@override
void onInit() {
httpClient.baseUrl = 'https://api.com';
httpClient.defaultDecoder = UserModel.fromJson;
// Intercept outbound requests
httpClient.addRequestModifier((request) {
request.headers['Authorization'] = 'Bearer TOKEN';
return request;
});
// Intercept incoming responses
httpClient.addResponseModifier<UserModel>((request, response) {
// Modify payload before UI delivery
return response;
});
// Authenticator & Automatic recovery
httpClient.addAuthenticator((request) async {
final tokenRes = await get("http://api.com/token");
request.headers['Authorization'] = "${tokenRes.body['token']}";
return request;
});
httpClient.maxAuthRetries = 3;
}
}
π‘οΈ Advanced Routing Middleware Pipelines
GetPage supports full middleware pipelines to intercept and validate route requests before screens build.
// β routing.dart
GetPage(
name: '/profile',
page: () => ProfileView(),
middlewares: [
AuthMiddleware(priority: 1),
AnalyticsMiddleware(priority: 2),
],
)
1. Build Custom Middleware
// β auth_middleware.dart
class AuthMiddleware extends GetMiddleware {
@override
int priority = 1;
@override
RouteSettings redirect(String route) {
final authService = Get.find<AuthService>();
return authService.isAuthenticated.value
? null
: RouteSettings(name: '/login');
}
}
2. Middleware Hooks
onPageCalled: Intercept the Page parameters before creation.onBindingsStart: Manipulate bindings list right before loading.onPageBuildStart: Execute code after loading bindings and before build.onPageBuilt: Capture the returned built page widget.onPageDispose: Execute tasks immediately upon page disposal.
π» Premium Helper Views (`GetView`, `GetResponsiveView`, `GetxService`)
1. GetView
An elegant, stateless wrapper containing a direct getter for your registered controller, cutting down boilerplate lookup code:
// β view.dart
class ProfileView extends GetView<ProfileController> {
@override
Widget build(BuildContext context) {
// Access 'controller' instantly without lookup or declaration!
return Text(controller.username);
}
}
2. GetResponsiveView
Rapidly build robust interfaces tailored for mobile, tablet, and desktop viewports:
// β view.dart
class HomeView extends GetResponsiveView<HomeController> {
@override
Widget? builder() {
if (screen.isPhone) return PhoneLayout();
if (screen.isTablet) return TabletLayout();
return DesktopLayout();
}
}
3. GetxService
A persistent, long-running service wrapper that cannot be auto-removed from memory, making it perfect for databases and cache engines:
// β db_service.dart
class DatabaseService extends GetxService {
Future<DatabaseService> init() async {
// Perform SQLite or Hive setup
return this;
}
}
π§ͺ Direct Unit Testing Harness
Easily test controllers, network responses, and routing transitions without rendering widget trees.
// β test/controller_test.dart
class Controller extends GetxController {
final name = 'guest'.obs;
void updateName(String newName) => name.value = newName;
}
void main() {
test('Test reactive controller state', () {
final controller = Controller();
expect(controller.name.value, 'guest');
// Register controller to trigger onInit hooks
Get.put(controller);
controller.updateName('Gaurav');
expect(controller.name.value, 'Gaurav');
// Teardown
Get.delete<Controller>();
});
}
Important
Call Get.reset() at the end of each test inside your tearDown blocks to clean the global service locator state and prevent memory bleed across execution suites.
π¬ Community Channels & Support
Collaborate, ask questions, and build the future of Flutter together:
- Slack: Join the Workspace
- Discord: Join the Server
- Telegram: Join the Chat
π± Contribution
We welcome your stars, feedback, and pull requests! Let's keep the best parts of GetX modernized, robust, and community-powered. β Star the repository to make your voice heard!
Libraries
- get
- GetX is an extra-light and powerful multi-platform framework. It combines high performance state management, intelligent dependency injection, and route management in a quick and practical way.
- get_animations/animations
- get_animations/extensions
- get_animations/get_animated_builder
- get_animations/index
- get_common/get_reset
- get_connect
- get_connect/connect
- get_connect/http/src/certificates/certificates
- get_connect/http/src/exceptions/exceptions
- get_connect/http/src/http
- get_connect/http/src/http/html/file_decoder_html
- get_connect/http/src/http/html/http_request_html
- get_connect/http/src/http/interface/request_base
- get_connect/http/src/http/io/file_decoder_io
- get_connect/http/src/http/io/http_request_io
- get_connect/http/src/http/mock/http_request_mock
- get_connect/http/src/http/request/http_request
- get_connect/http/src/http/stub/file_decoder_stub
- get_connect/http/src/http/stub/http_request_stub
- get_connect/http/src/http/utils/body_decoder
- get_connect/http/src/interceptors/get_modifiers
- get_connect/http/src/multipart/form_data
- get_connect/http/src/multipart/multipart_file
- get_connect/http/src/request/request
- get_connect/http/src/response/client_response
- get_connect/http/src/response/response
- get_connect/http/src/status/http_status
- get_connect/http/src/utils/utils
- get_connect/sockets/sockets
- get_connect/sockets/src/socket_notifier
- get_connect/sockets/src/sockets_html
- get_connect/sockets/src/sockets_io
- get_connect/sockets/src/sockets_stub
- get_core/get_core
- get_core/src/flutter_engine
- get_core/src/get_interface
- get_core/src/get_main
- get_core/src/log
- get_core/src/smart_management
- get_core/src/typedefs
- get_instance/get_instance
- get_instance/src/bindings_interface
- get_instance/src/extension_instance
- get_instance/src/lifecycle
- get_navigation/src/bottomsheet/bottomsheet
- get_navigation/src/dialog/dialog_route
- get_navigation/src/root/get_cupertino_app
- get_navigation/src/root/get_material_app
- get_navigation/src/root/get_root
- get_navigation/src/root/internacionalization
- get_navigation/src/router_report
- get_navigation/src/routes/circular_reveal_clipper
- get_navigation/src/routes/custom_transition
- get_navigation/src/routes/default_route
- get_navigation/src/routes/default_transitions
- get_navigation/src/routes/get_information_parser
- get_navigation/src/routes/get_route
- get_navigation/src/routes/get_router_delegate
- get_navigation/src/routes/get_transition_mixin
- get_navigation/src/routes/index
- get_navigation/src/routes/modules
- get_navigation/src/routes/new_path_route
- get_navigation/src/routes/observers/route_observer
- get_navigation/src/routes/page_settings
- get_navigation/src/routes/parse_route
- get_navigation/src/routes/route_middleware
- get_navigation/src/routes/route_report
- get_navigation/src/routes/router_outlet
- get_navigation/src/routes/test_kit
- get_navigation/src/routes/transitions_type
- get_navigation/src/routes/url_strategy/impl/io_url
- get_navigation/src/routes/url_strategy/impl/stub_url
- get_navigation/src/routes/url_strategy/impl/web_url
- get_navigation/src/routes/url_strategy/url_strategy
- get_navigation/src/snackbar/snackbar
- get_navigation/src/snackbar/snackbar_controller
- get_rx/get_rx
- get_rx/src/rx_stream/rx_stream
- get_rx/src/rx_typedefs/rx_typedefs
- get_rx/src/rx_types/rx_types
- get_rx/src/rx_workers/rx_workers
- get_rx/src/rx_workers/utils/debouncer
- get_state_manager/get_state_manager
- get_state_manager/src/rx_flutter/rx_getx_widget
- get_state_manager/src/rx_flutter/rx_notifier
- get_state_manager/src/rx_flutter/rx_obx_widget
- get_state_manager/src/rx_flutter/rx_ticket_provider_mixin
- get_state_manager/src/simple/get_controllers
- get_state_manager/src/simple/get_responsive
- get_state_manager/src/simple/get_state
- get_state_manager/src/simple/get_view
- get_state_manager/src/simple/get_widget_cache
- get_state_manager/src/simple/list_notifier
- get_state_manager/src/simple/mixin_builder
- get_state_manager/src/simple/simple_builder
- get_utils/get_utils
- get_utils/src/equality/equality
- get_utils/src/extensions/context_extensions
- get_utils/src/extensions/double_extensions
- get_utils/src/extensions/duration_extensions
- get_utils/src/extensions/dynamic_extensions
- get_utils/src/extensions/event_loop_extensions
- get_utils/src/extensions/export
- get_utils/src/extensions/int_extensions
- get_utils/src/extensions/internacionalization
- get_utils/src/extensions/iterable_extensions
- get_utils/src/extensions/num_extensions
- get_utils/src/extensions/string_extensions
- get_utils/src/extensions/widget_extensions
- get_utils/src/get_utils/get_utils
- get_utils/src/platform/platform
- get_utils/src/platform/platform_io
- get_utils/src/platform/platform_stub
- get_utils/src/platform/platform_web
- get_utils/src/queue/get_queue
- get_utils/src/widgets/optimized_listview
- instance_manager
- Get Instance Manager is a modern and intelligent dependency injector that injects and removes dependencies seasonally.
- route_manager
- Get Navigator allows you to navigate routes, open snackbars, dialogs and bottomsheets easily, and without the need for context.
- state_manager
- Get State Manager is a light, modern and powerful state manager to Flutter
- utils
- Get utils is a set of tools that allows you to access high-level APIs and obtain validation tools for Flutter and GetX