api_rest_flutter_mobile 3.0.0
api_rest_flutter_mobile: ^3.0.0 copied to clipboard
A comprehensive Flutter package for data management with online/offline capabilities, schema-driven validation, and bidirectional synchronization for iOS and Android applications.
API REST Flutter Mobile #
A comprehensive Flutter package for data management with online/offline capabilities, designed for enterprise applications requiring robust data synchronization and offline operations.
Features #
- ✅ Online/Offline Mode: Automatic switching between online and offline operations
- ✅ Data Synchronization: Bidirectional sync with transfer status tracking
- ✅ Schema-Based Validation: Dynamic data validation using JSON schemas
- ✅ Complete CRUD Operations: Create, read, update, delete with offline support
- ✅ Built-in Authentication: OAuth-like session management system
- ✅ Local Cache: Local storage using ObjectBox for fast access
- ✅ Regex Validation: Data type validation with customizable regular expressions
- ✅ Pagination: Full support for paginated results
- ✅ Multi-provider: Provider-based architecture for different data sources
Platform Support #
| Platform | Support |
|---|---|
| Android | ✅ |
| iOS | ✅ |
| Web | ❌ |
| Desktop | ❌ |
Installation #
Add this to your pubspec.yaml:
dependencies:
api_rest_flutter_mobile: ^2.0.0
Then run:
flutter pub get
Quick Start #
1. Initialize ApiRest #
import 'package:api_rest_flutter_mobile/api_rest.dart';
import 'package:flutter_data_cloud_provider/flutter_data_cloud_provider.dart';
import 'package:flutter_data_mobile_provider/flutter_data_mobile_provider.dart';
import 'package:flutter_models_provider/global/environment.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Create provider instances
final cloudDb = CloudDb(
endpointApi: 'https://your-api.com/api',
endpointAuth: 'https://your-api.com/auth',
);
final mobileDb = MobileDb();
// Create ApiRest singleton
final apiRest = ApiRest(
cloudDb: cloudDb,
mobileDb: mobileDb,
modeToWork: ModeToWork.online,
gestorData: GestorData.objectBox,
coleccionFuncionesBackend: 'funcionesBackend',
);
// Initialize ObjectBox and SharedPreferences
await apiRest.init();
runApp(MyApp());
}
2. CRUD Operations #
Create Record
final producto = ColeccionObjBox(
coleccion: 'productos',
estado: 'A',
data: jsonEncode({
'nombre': 'Laptop HP',
'precio': 1299.99,
'stock': 50,
}),
);
final result = await apiRest.guardar<ColeccionObjBox>(
data: producto,
versionData: '1',
);
if (result.containsKey(EnvironmentApiRest.dataOk)) {
final saved = result[EnvironmentApiRest.data] as ColeccionObjBox;
print('Created with ID: ${saved.idServer}');
}
Read by ID
final result = await apiRest.leeById<ColeccionObjBox>(
coleccion: 'productos',
consulta: '{"_id": "$productId"}',
argsLocalBD: [['idServer'], ['='], [productId]],
);
if (result.containsKey(EnvironmentApiRest.dataOk)) {
final producto = result[EnvironmentApiRest.data] as ColeccionObjBox;
print('Product: ${jsonDecode(producto.data)['nombre']}');
}
Query Records
final result = await apiRest.obtener<ColeccionObjBox>(
coleccion: 'productos',
consulta: '{"data.activo": true}',
argsLocalBD: [['activo'], ['='], ['true']],
limit: '25',
skip: '0',
);
if (result.containsKey(EnvironmentApiRest.dataOk)) {
final productos = List<ColeccionObjBox>.from(result[EnvironmentApiRest.data]);
print('Total: ${result[EnvironmentApiRest.totalItems]}');
}
Update Record
final result = await apiRest.actualizar<ColeccionObjBox>(
data: productoModificado,
versionData: '1',
);
3. Synchronization #
Download from Server
final result = await apiRest.downLoadInfoFromServer<ColeccionObjBox>(
coleccion: 'productos',
);
if (result[EnvironmentApiRest.existeData] == true) {
print('Data downloaded successfully');
}
Upload to Server
final result = await apiRest.uploadInfoToServer<ColeccionObjBox>(
coleccion: 'productos',
versionData: '1',
);
4. Schema Validation #
import 'package:api_rest_flutter_mobile/util/utils_data_api_rest.dart';
final utilsData = UtilsDataApiRest(apiRest: apiRest);
// Get schema
final esquema = await apiRest.obtieneEsquema(valor: 'productos');
// Validate data
final validation = await utilsData.validaDataInMap(
esquema: esquema,
mapaActualizado: productData,
);
if (validation.containsKey(EnvironmentApiRest.dataOk)) {
print('Validation passed');
} else {
print('Error: ${validation[EnvironmentApiRest.error]}');
}
Query Formats #
MongoDB-Style (Online) #
// Simple query
'{"data.nombre": "Juan"}'
// Regex search
'{"data.descripcion": {"\$regex": ".*texto.*", "\$options": "i"}}'
// Range query
'{"data.edad": {"\$gte": 18, "\$lte": 65}}'
// AND condition
'{"\$and": [{"data.activo": true}, {"data.categoria": "A"}]}'
ObjectBox Args (Offline) #
// Format: [[fields], [operators], [values]]
// Operators: =, !=, >, <, >=, <=, like
[['nombre', 'activo'], ['like', '='], ['Juan', 'true']]
Response Format #
All operations return a Map<String, dynamic>:
Success:
{
EnvironmentApiRest.dataOk: 'OK',
EnvironmentApiRest.data: <result>,
}
Error:
{
EnvironmentApiRest.dataNOk: 'NOK',
EnvironmentApiRest.error: 'Error message',
}
Data Model #
Records use the ColeccionObjBox model with standard fields:
| Field | Description |
|---|---|
idServer |
Server-assigned ID (MongoDB ObjectId) |
idMobile |
Device-assigned ID (for offline records) |
eTransfer |
Sync status: '' (synced) or 'D' (pending) |
creadoEl |
Creation timestamp |
estado |
Record status (A=Active, I=Inactive) |
coleccion |
Collection name |
data |
JSON string with record data |
dataOriginal |
Last synced state (for change detection) |
Requirements #
- Flutter SDK: >=3.10.0
- Dart SDK: >=3.1.0 <4.0.0
- iOS: >=11.0
- Android: minSdkVersion 21
Dependencies #
This package uses the RobleSistemas provider ecosystem:
flutter_objectbox_provider: Local database (ObjectBox)flutter_http_provider: HTTP operationsflutter_security_provider: Security and authenticationflutter_data_cloud_provider: Cloud operationsflutter_data_mobile_provider: Mobile operationsflutter_data_shp_provider: SharedPreferencesflutter_utils_providers: General utilitiesflutter_models_provider: Data models
License #
This project is licensed under the MIT License - see the LICENSE file for details.
Author #
RobleSistemas
Support #
For issues or feature requests, please contact RobleSistemas or open an issue on pub.flutter-io.cn.