Built on top of GetX for effortless UI state handling
get_ui_state_package
A lightweight and powerful Flutter package built on top of GetX that simplifies managing UI states such as:
- 🟡 Loading
- ✅ Success
- ❌ Error
- 📭 Empty
- 🟢 Initial
It helps you avoid boilerplate by providing a reactive and customizable way to handle common UI flows with retry and global configuration support.
🚀 Features
- Reactive
UiStateModel<T>
to wrap your data UiStateBuilder
widget to handle all states easily- Global configuration with per-widget override support
- Retry support
- Built-in
fromFuture()
andfromStream()
helpers
🛠 Installation
flutter pub add get_ui_state_package
📦 Import
import 'package:get_ui_state_package/get_ui_state_package.dart';
🌍 Global Setup (main.dart)
void main() {
GlobalUiStateConfig.initialize(
initialWidget: const Center(child: Text("🚀 Welcome")),
loadingWidget: const Center(child: CircularProgressIndicator()),
emptyWidget: const Center(child: Text("📭 No data to show")),
errorBuilder: (context, error) => Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(error.toString()),
ElevatedButton(
onPressed: () {},
child: const Text("Retry"),
),
],
),
),
);
runApp(const MyApp());
}
💡 Basic Example
class ExampleController extends GetxController {
final state = UiStateModel<String>.initial().obs;
void loadData() async {
state.value = UiStateModel.loading();
await Future.delayed(const Duration(seconds: 2));
state.value = UiStateModel.success("Data Loaded");
}
}
class ExampleScreen extends StatelessWidget {
final controller = Get.put(ExampleController());
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("Get UI State")),
body: UiStateBuilder<String>(
uiStateModel: controller.state,
builder: (context, data) => Center(child: Text(data)),
isRetry: true,
retryFunction: controller.loadData,
),
);
}
}
⚡ Async Helpers
final stateFromFuture = UiStateModel<String>.fromFuture(myFuture());
final stateFromStream = UiStateModel<int>.fromStream(myStream());
📃 License
Licensed under the MIT License
❤️ Contribute
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
GitHub → https://github.com/sourabhappdev/get_ui_state_package/tree/dev
📋 Copy Full Example
class ExampleController extends GetxController {
final state = UiStateModel.initial().obs;
void loadData() async {
state.value = UiStateModel.loading();
await Future.delayed(const Duration(seconds: 2));
state.value = UiStateModel.success("Data Loaded");
}
}
class ExampleScreen extends StatelessWidget {
final controller = Get.put(ExampleController());
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("Get UI State")),
body: UiStateBuilder(
uiStateModel: controller.state,
builder: (context, data) => Center(child: Text(data)),
isRetry: true,
retryFunction: controller.loadData,
),
);
}
}