offline_sync
Um pacote projetado para gerenciar e sincronizar dados com foco em funcionamento offline, garantindo funcionalidade contínua independentemente da conectividade com a internet, com sincronização automática ao restabelecimento da conexão.
Um pacote projetado para gerenciar e sincronizar dados com foco em funcionamento offline, garantindo funcionalidade contínua independentemente da conectividade com a internet, com sincronização automática ao restabelecimento da conexão.
^6.0.3^5.0.3{"sdk":"flutter"}^1.2.1^1.9.0^2.2.3^2.3.3+1{"sdk":"flutter"}^6.0.0^5.3.2^2.3.3^1.21.1^2.3.0anyanyTexto original em inglês. Visite o GitHub para a versão atual.
OfflineSync is a Flutter package that provides offline-first data management and synchronization. It ensures smooth functionality even without an internet connection and syncs data once connectivity is restored.
Add this to your package's pubspec.yaml file:
dependencies:
offline_sync: ^1.0.0
First, initialize the OfflineSync instance in your app:
import 'package:offline_sync/offline_sync.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final offlineSync = OfflineSync(
config: OfflineSyncConfig(
apiEndpoint: 'https://your-custom-api.com',
// encryptionKey is optional and will be generated automatically if not provided
),
);
await offlineSync.initialize();
runApp(MyApp());
}
Set a custom endpoint for your specific server:
final offlineSync = OfflineSync();
offlineSync.setApiEndpoint('https://your-custom-api.com');
To save data locally and queue it for syncing:
final offlineSync = OfflineSync();
await offlineSync.saveLocalData('user_1', {
'name': 'John Doe',
'email': 'john@example.com',
'age': 30,
});
To read locally stored data:
final userData = await offlineSync.readLocalData('user_1');
if (userData != null) {
print('User name: ${userData['name']}');
} else {
print('User not found');
}
The package automatically syncs data when an internet connection is available. However, you can manually trigger a sync:
try {
await offlineSync.updateFromServer();
print('Data updated from server successfully');
} catch (e) {
print('Failed to update from server: $e');
}
Set the authentication token for API requests:
await offlineSync.setAuthToken('your_auth_token_here');
The package includes basic conflict resolution. You can customize this by extending the OfflineSync class:
class CustomOfflineSync extends OfflineSync {
@override
Future<Map<String, dynamic>> resolveConflict(
String id,
Map<String, dynamic> localData,
Map<String, dynamic> serverData
) async {
// Implement your custom conflict resolution strategy here
// This example prefers local changes
final resolvedData = Map<String, dynamic>.from(serverData);
localData.forEach((key, value) {
if (value != serverData[key]) {
resolvedData[key] = value;
}
});
return resolvedData;
}
}
The package processes sync queue in batches. You can adjust the batch size:
class CustomOfflineSync extends OfflineSync {
@override
int get batchSize => 100; // Default is 50
}
Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License - see the LICENSE file for details.
Wrap your app with the OfflineSyncProvider to make the sync instance and its status available throughout the widget tree:
final offlineSync = OfflineSync(config: OfflineSyncConfig(
apiEndpoint: 'https://your-api.com',
// encryptionKey is now optional
));
await offlineSync.initialize();
runApp(
OfflineSyncProvider(
offlineSync: offlineSync,
child: MyApp(),
),
);
Then, anywhere in your widget tree, you can access the sync instance and status:
final offlineSync = OfflineSyncProvider.of(context);
ValueListenableBuilder<SyncStatus>(
valueListenable: offlineSync.syncStatus,
builder: (context, status, _) {
// Show sync status in UI
return Text('Sync status: $status');
},
)
apiEndpoint (String, required): The server endpoint for syncing.batchSize (int, default: 50): Number of items to sync per batch.encryptionKey (String, optional): 32-character key for AES encryption. If not provided, a secure key is generated and stored automatically.encryptionIV (IV, optional): Custom IV for encryption.conflictResolver (callback, optional): Custom function for resolving data conflicts.logger (callback, optional): Function for debug or error logging.OfflineSync({required OfflineSyncConfig config, ...}): Create a new instance with config and optional injected dependencies.Future<void> initialize(): Initialize the database and connectivity.Future<void> setAuthToken(String token): Set the auth token for API requests.Future<void> saveLocalData(String id, Map<String, dynamic> data): Save data locally and queue for sync.Future<Map<String, dynamic>?> readLocalData(String id): Read local data by ID.Future<void> updateFromServer(): Manually trigger sync from server.ValueNotifier<SyncStatus> syncStatus: Listen for sync status changes.ValueNotifier<SyncErrorType?> lastError: Listen for error changes.ValueNotifier<double> syncProgress: Listen for sync progress (0.0 to 1.0).final offlineSync = OfflineSync();
await offlineSync.initialize();
offlineSync.setApiEndpoint('https://api.com');
final offlineSync = OfflineSync(
config: OfflineSyncConfig(
apiEndpoint: 'https://api.com',
// encryptionKey is now optional
),
);
await offlineSync.initialize();
OfflineSyncProvider to expose the instance to your widget tree.OfflineSyncConfig instead of setters.