builder_state
builder_state
is a flexible Flutter package for managing asynchronous UI states with ease. It provides a customizable widget to handle states like loading, success, error, and empty data.
Features
- Loading Screen: Displays a loading spinner or custom waiting text during data fetching.
- Error Handling: Shows a customizable error screen based on different error types.
- No Data Screen: Displays a custom message when no data is available.
- Customizable UI: Easily extendable for custom success, error, and waiting states.
Getting Started
Add the following to your pubspec.yaml
:
dependencies:
builder_state: latest
Then run:
flutter pub get
Usage
import 'package:builder_state/builder_state.dart';
FutureLoader<String>(
future: myAsyncFunction(),
onWaiting: (context, snapshot) => LoadingScreen(waitingTxt: 'Loading...'),
onSuccessHasData: (context, snapshot) => SuccessScreen(data: snapshot.data!),
onError: (context, snapshot) => ErrorScreen(error: snapshot.error),
onSuccessNoData: (context, snapshot) => NoDataScreen(),
)
Customizing States
You can customize the loading, error, and empty data states as follows:
Widget defaultOnWaiting({String? waitingTxt}) =>
LoadingScreen(waitingTxt: waitingTxt);
Widget defaultOnError(BuildContext context, Object? error, {String? errorTitle}) =>
_buildError(context, error, errorTitle);
Widget _buildError(BuildContext context, Object? error, String? errorTitle) {
String errorMsg;
if (errorTitle != null) {
errorMsg = errorTitle;
} else if (error.toString().contains('permission-denied')) {
errorMsg = 'No Permission';
} else if (error == null || error.toString().contains('unknown')) {
errorMsg = 'No Internet';
} else {
errorMsg = 'Internet Connection Failed';
}
return buildNoItem(title: errorMsg);
}
API Reference
FutureLoader
future
: (Future The future to be awaited.onSuccessHasData
: (AsyncWidgetBuilder Widget displayed when data is available.onSuccessNoData
: (AsyncWidgetBuilder Widget displayed when no data is available.onError
: (AsyncWidgetBuilder Widget displayed on error.onWaiting
: (AsyncWidgetBuilder Widget displayed during loading.waitingTxt
: (String?) Custom text shown in the loading state.
Example
class MyHomePage extends StatelessWidget {
const MyHomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Builder State Example'),
),
body: Center(
child: FutureLoader<String>(
future: fetchData(),
onWaiting: (context, snapshot) => LoadingScreen(waitingTxt: 'Fetching data...'),
onSuccessHasData: (context, snapshot) => Text('Data: ${snapshot.data}'),
onError: (context, snapshot) => Text('Error: ${snapshot.error}'),
onSuccessNoData: (context, snapshot) => const NoItemScreen(),
),
),
);
}
}
Future<String> fetchData() async {
await Future.delayed(const Duration(seconds: 2));
return 'Hello, World!';
}
License
This project is licensed under the MIT License.
Contributions
Feel free to open an issue or submit a pull request. Contributions are always welcome!