Local Function Collections
A robust, production-ready helper utility package for Flutter that encapsulates standard workflows: advanced network requests, context-safe navigation, customized alert dialogs, and persistent encrypted secure storage.
Features
| Category | Class | Description |
|---|---|---|
| π Networking | LocalAPIsRequest |
Unified HTTP client powered by Dio and automatic FormData construction for file uploads. |
| π‘οΈ Storage | LocalSecureStorage |
Simple keychain/keystore encapsulation for reading, writing, and wiping highly sensitive encrypted key-value string data. |
| π¬ Dialogs | LocalDialogFunction |
Pre-built alert interfaces including context-safe blocking Loaders, standard OK Informational alerts, and dynamic Option Dialogs. |
| πΊοΈ Navigation | LocalRouteNavigator |
Simplified routing patterns including basic pushes, inline replacements, complete stack-resets, and parameterized pops. |
Getting Started
Just make sure your flutter version is up to date.
Installation
Add local_function_collections to your pubspec.yaml file:
Usage
You only need a single import statement to gain access to the entire utility pipeline:
import 'package:local_function_collections/local_function_collections.dart';
1. Network Request & Multi-File Upload (LocalAPIsRequest)
Execute network protocols (GET, POST, PUT, DELETE) with centralized error delegation seamlessly.
void makeNetworkCall(BuildContext context) async {
final cancelToken = CancelToken();
Response? response = await LocalAPIsRequest.submitRequest(
requestType: RequestType.post,
apisURL: "[https://api.example.com/v1/upload](https://api.example.com/v1/upload)",
cancelToken: cancelToken,
bodyData: {"category": "profile_pictures"},
files: UploadFile(
fileParameterName: "images",
files: [File("/path/to/image1.png"), File("/path/to/image2.png")],
isArrayKeyMethod: true, // Appends 'images[0]', 'images[1]' parameter structural keys
),
errorHandler: (exception, stackTrace) {
// Handles anomalies or non-200 Status Code responses safely inside the scope
print("Network Anomaly Caught: $exception");
},
);
if (response != null) {
print("Payload received: ${response.data}");
}
}
2. Dialog Operations (LocalDialogFunction)
// Trigger an Information Alert
void showSuccessDialog() {
LocalDialogFunction.okDialog(
context: context,
title: "Operation Successful",
contentText: "Your preferences have been updated successfully.",
contentAlign: TextAlign.center,
onClose: () => print("Dialog dismissed"),
);
}
// Trigger an Action Prompt Option
void onDeletePressed() {
LocalDialogFunction.optionDialog(
context: context,
title: "Confirm Deletion",
contentText: "Are you sure you want to purge this asset permanently?",
acceptText: "Delete",
declineText: "Cancel",
onAccept: () => proceedDestruction(),
onDecline: () => traceCancellation(),
);
}
3. Encrypted Key-Value Persistence (LocalSecureStorage)
// Write Encrypted Session Tokens
Future<bool> onWriteAuth() async {
bool result = await LocalSecureStorage.writeKey(key: "auth_token", data: "JWT_STRING");
return result;
}
// Retrieve Protected Credentials Safely
Future<String?> onReadAuth() async {
String? secureToken = await LocalSecureStorage.readKey(key: "auth_token");
return secureToken;
}
// Purge Selected Registry Entries
Future<bool> onDeleteAuth() async {
bool result = await LocalSecureStorage.deleteKey(key: "auth_token");
return result;
}
// Total Storage Wipeout
Future<bool> onClearKey() async {
bool result = await LocalSecureStorage.clearKey();
return result;
}
4. Contextual Route Navigation (LocalRouteNavigator)
// Standard Navigation Push
void openDetailPage() {
LocalRouteNavigator.moveTo(
context: context,
target: const DetailScreen(),
callbackFunction: (result) => processReturnedValue(result),
);
}
// Destructive Linear Target Replacement
void onLoginSuccess() {
LocalRouteNavigator.replaceWith(
context: context, target: const DashboardView(),
);
}
// Complete Navigation Stack Flush and Root Redirection
void onLogoutSuccess() {
LocalRouteNavigator.redirectTo(
context: context, target: const LoginView(),
);
}
// Parameterized Stack Pop Closures
void onPopWithResult(bool? result) {
LocalRouteNavigator.closeBack(
context: context, callbackResult: result,
);
}
Technical Details & Architecture
Iterable TCP Lifecycle Performance: LocalAPIsRequest uses a unified, static shared Dio instance under the hood. This ensures connection reuse via connection pools, saving system memory and accelerating subsequent handshakes. Asynchronous Lifecycle Gap Protections: Dialog closures and network dispatches respect stateful attachment checking (Widget.mounted), guarding your runtime stack against thread safety alerts or memory leakage crashes.
Additional information
Contributions, feature extensions, and architectural critiques are highly welcome. Feel free to connect or log technical feedback via our official touchpoints:
Instagram: @raznovrnf email: novian.shatter@gmail.com.
Developed with π by Razy Novian. Licensed under the MIT License.