flutterx_starter_kit 0.0.6
flutterx_starter_kit: ^0.0.6 copied to clipboard
A comprehensive starter kit that accelerates Flutter app development with ready-to-use components and best practices, especially for GetX state management.
FlutterX Starter Kit #

A comprehensive starter kit that accelerates Flutter app development with ready-to-use components and best practices, especially for GetX state management.
Features #
✅ Currently Available #
- CLI Helpers - Generate your project fast code fast deploy
- ApiClient - Powerful HTTP client with complete features
- UI Components - Widget library (TextKit, ButtonKit, SnackbarKit)
Coming Soon #
- Responsive Utils - Helper for responsive design
- Logger - Advanced logging system
Platform Support #
| Android | iOS | MacOS | Web |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Requirements #
- Flutter:
>=1.17.0 - Dart:
>=3.9.0
Installation #
Add this package to your pubspec.yaml:
dependencies:
flutterx_starter_kit: 0.0.6
Or install via command line:
flutter pub add flutterx_starter_kit
Getting Started #
Setup #
Add dependencies flutter_dotenv
flutter pub add flutter_dotenv
Create .env in root folder
API_BASE_URL = www.example-api.com
Add .env to assets
flutter:
assets:
- .env
Don't forget add async in your main()
void main() async {
Initialize ApiClient with CLI #
flutter pub global activate flutterx_starter_kit
Or
dart pub global activate flutterx_starter_kit
Add flutterx ApiClient:
flutterx init
Add flutterx font:
// default
flutterx font
// long syntax
flutterx font --name montserrat
// short syntax
flutterx font -n nunito
ApiClient Usage #
API Reference
Instance Methods #
- GET request -
get(String endpoint, {Map<String, dynamic>? query, ApiRequestOptions opts}) - POST request -
post(String endpoint, dynamic body, {Map<String, dynamic>? query, ApiRequestOptions opts}) - PUT request -
put(String endpoint, dynamic body, {Map<String, dynamic>? query, ApiRequestOptions opts}) - PATCH request -
patch(String endpoint, dynamic body, {Map<String, dynamic>? query, ApiRequestOptions opts}) - DELETE request -
delete(String endpoint, {Map<String, dynamic>? query, ApiRequestOptions opts, dynamic body})
ApiConfig #
Configuration for ApiClient.
Properties:
baseUrl(String) - API base URL without trailing slashtimeout(Duration) - Request timeout, default 20 secondstokenProvider(TokenProvider?) - Function to get access tokenrefreshToken(RefreshToken?) - Function to refresh token on 401defaultHeaders(DefaultHeadersBuilder?) - Function for global headersonUnauthorized(OnUnauthorized?) - Callback when unauthorizedhttpClient(http.Client?) - Custom HTTP client
ApiRequestOptions #
Per-request options to override global configuration.
Properties:
baseUrl(String?) - Override base URL for this requestheaders(Map<String, String>?) - Additional/override headersskipAuth(bool) - Skip Authorization header, default falsequery(Map<String, dynamic>?) - Query parameters
ApiResponse<T> #
Response wrapper from HTTP request.
Properties:
statusCode(int) - HTTP status codedata(T?) - Parsed response body (JSON → Map/List)headers(Map<String, String>) - Response headers
Exceptions #
ApiException
Exception for HTTP errors (4xx, 5xx).
Properties:
statusCode(int?) - HTTP status codemessage(String) - Error messagedata(dynamic) - Response body
// GET request
final response = await ApiClient.instance.get('/users');
print(response.data); // parsed JSON response
// POST request
final newUser = await ApiClient.instance.post('/users', {
'name': 'John Doe',
'email': 'john@example.com',
});
// PUT request
final updated = await ApiClient.instance.put('/users/1', {
'name': 'Jane Doe',
});
// DELETE request
await ApiClient.instance.delete('/users/1');
// Global Authorization
void main() {
ApiClient.init(ApiConfig(
baseUrl: 'https://jsonplaceholder.typicode.com',
tokenProvider: () async => 'xxxxxxxx',
));
runApp(MyApp());
}
// Skip headers
final public = await ApiClient.instance.get('/v1/info',
opts: const ApiRequestOptions(skipAuth: true),
);
// Need others headers
await ApiClient.instance.get(
'/v1/public-info',
opts: const ApiRequestOptions(
skipAuth: true,
headers: {'X-Trace': 'abc123'},
),
);
// Not set global, need authorization
ApiClient.init(ApiConfig(baseUrl: 'https://api.example.com'));
final res1 = await ApiClient.instance.get(
'/v1/secure-data',
opts: const ApiRequestOptions(
headers: {'Authorization': 'Bearer xxx123xxx123'}, // If not set global, add 'Bearer'
),
);
// Not set global, no needed authorization
final res2 = await ApiClient.instance.get('/v1/public-info');
TextKit Usage #

Currently Supported Fonts
| Font Name | Command | Font Name | Command |
|---|---|---|---|
| Poppins | --font poppins |
Inter | --font inter |
| Fredoka | --font fredoka |
Raleway | --font raleway |
| Roboto | --font roboto |
Nunito | --font nunito |
| Montserrat | --font montserrat |
Lato | --font lato |
| Open Sans | --font opensans |
(upcoming) | (upcoming) |
Quick Reference
| Method | Size | Method | Size |
|---|---|---|---|
displayLarge |
57 | labelLarge |
14 |
displayMedium |
45 | labelMedium |
12 |
displaySmall |
36 | labelSmall |
11 |
headLineLarge |
32 | bodyLarge |
16 |
headLineMedium |
28 | bodyMedium |
14 |
headLineSmall |
24 | bodySmall |
12 |
titleLarge |
22 | ||
titleMedium |
16 | ||
titleSmall |
14 |
TextKit.displayLarge('Display Large'),
TextKit.displayMedium('Display Medium'),
TextKit.displaySmall('Display Small'),
TextKit.headlineLarge('Headline Large'),
TextKit.headlineMedium('Headline Medium'),
TextKit.headlineSmall('Headline Small'),
TextKit.titleLarge('Title Large'),
TextKit.titleMedium('Title Medium'),
TextKit.titleSmall('Title Small'),
TextKit.bodyLarge('Body Large'),
TextKit.bodyMedium('Body Medium'),
TextKit.bodySmall('Body Small'),
TextKit.labelLarge('Label Large'),
TextKit.labelMedium('Label Medium'),
TextKit.labelSmall('Label Small'),
TextKit.bodyLarge(
'Very long text that might overflow...',
maxLines: 2,
overflow: TextOverflow.ellipsis,
color: Colors.blue,)
ButtonKit Usage #

ButtonKit(
text: "Sign In",
textColor: Colors.white,
bgColor: Colors.blue,
press: () {},
width: 200,
height: 50,
),
ButtonKitGradient(
text: "This is Gradient",
textColor: Colors.white,
bgColor1: Colors.cyan,
bgColor2: Colors.purpleAccent,
press: () {},
width: 200,
),
SnackbarKit Usage #

SnackbarKit.success(context,'Profile updated!',);
SnackbarKit.error(context,'Connection failed',);
SnackbarKit.warning(context,'Low storage',);
SnackbarKit.info(context,'New update available',);
SnackbarKit.normal(context,'Settings saved',)
Additional Information #
Issues and Feedback #
If you find a bug or have a feature suggestion:
Roadmap #
- ❌ UI Components (Button, Card, TextField, etc.)
- ❌ Responsive utilities
- ❌ Theme management
- ❌ Navigation utilities
- ❌ Advanced logging system
- ❌ Performance monitoring
License #
This package is licensed under the MIT License.
Author #
Ramadhan Hadiatma
- GitHub: @ramadhanhadiatmaa
- Repository: flutterx_starter_kit
Support #
If this package helps you, consider:
- ⭐ Star the repository on GitHub
- 👍 Like the package on pub.flutter-io.cn
- 📢 Share with other Flutter developers
Made with ❤️ by Ramadhan Hadiatma