RxCacheManager is a caching library for Flutter that provides a simple and flexible way to cache data and retrieve it efficiently. It uses a strategy-based approach, allowing you to define different caching strategies and apply them to your data. This README will guide you through the basic usage of RxCacheManager and how to integrate it into your Flutter project.
To use RxCacheManager in your Flutter project, follow these steps:
- Add the
rx_cache_manager
dependency to yourpubspec.yaml
file:
dependencies:
flutter:
sdk: flutter
rx_cache_manager: ^x.x.x # Replace with the latest version available
Run flutter pub get to fetch the new dependency.
Import the library in your Dart files:
import 'package:rx_cache_manager/rx_cache_manager.dart';
RxCacheManager provides a caching mechanism for any type of data you want to cache. To use it, you need to define the data type you want to cache and its corresponding serializer and deserializer functions.
Example: Caching PayoutSettings In this example, we will demonstrate how to cache and retrieve PayoutSettings data using RxCacheManager. First, let's define the PayoutSettings class and its serializer and deserializer functions:
class PayoutSettings {
// Class implementation...
factory PayoutSettings.fromMap(Map<String, dynamic> json) {
// Deserialization logic...
}
Map<String, dynamic> toMap() {
// Serialization logic...
}
}
To start using RxCacheManager, you need to initialize it with an instance of CacheStorage. The CacheStorage is responsible for handling the actual storage of cached data. Here's an example of how to initialize RxCacheManager:
void main() async {
final cache = RxCacheManager(CacheStorage("default"));
// Other code...
}
To cache data, you'll use the write method of the RxCacheManager instance. Here's an example of caching PayoutSettings data:
void main() async {
final cache = RxCacheManager(CacheStorage("default"));
// Caching PayoutSettings data
final payoutSettings = PayoutSettings(
id: "1234",
interval: "monthly",
// Other properties...
);
await cache.write("payout-settings", payoutSettings.toMap());
// Other code...
}
To retrieve data from the cache, you'll use the from method of the RxCacheManager instance along with a caching strategy. Here's an example of retrieving PayoutSettings data:
In this example, we used the CacheOrAsyncStrategy strategy, which first tries to fetch the data from the cache and, if not available or expired, falls back to an asynchronous data source.
void main() async {
final cache = RxCacheManager(CacheStorage("default"));
// Retrieving PayoutSettings data
final request = await cache
.from<PayoutSettings, Map>("payout-settings")
.withAsync(() => Future.delayed(
const Duration(seconds: 2),
() => {
"id": "1234",
"interval": "monthly",
// Other properties...
},
))
.withSerializer((json) => PayoutSettings.fromMap(json))
.withStrategy(CacheOrAsyncStrategy())
.withTtl(30000000)
.execute();
print(request?.toMap());
// Other code...
}
The JustCacheStrategy fetches data from the cache and doesn't attempt to update it even if it's expired.
final request = await cache
.from<PayoutSettings, Map>("payout-settings")
.withStrategy(JustCacheStrategy())
.execute();
JustAsyncStrategy The JustAsyncStrategy fetches data from the asynchronous source and doesn't attempt to cache it.
final request = await cache
.from<PayoutSettings, Map>("payout-settings")
.withAsync(() => fetchPayoutSettingsFromServer()) // Replace with your async function
.withStrategy(JustAsyncStrategy())
.execute();
The CacheOrAsyncStrategy first tries to fetch the data from the cache and, if not available or expired, falls back to an asynchronous data source.
final request = await cache
.from<PayoutSettings, Map>("payout-settings")
.withAsync(() => fetchPayoutSettingsFromServer()) // Replace with your async function
.withStrategy(CacheOrAsyncStrategy())
.execute();
The CacheAndAsyncStrategy always returns the cached content and tries to update it if the cache expires.
final request = await cache
.from<PayoutSettings, Map>("payout-settings")
.withAsync(() => fetchPayoutSettingsFromServer()) // Replace with your async function
.withStrategy(CacheAndAsyncStrategy())
.execute();
The AsyncOrCacheStrategy first tries to fetch the data from the asynchronous source and, if unsuccessful, falls back to the cache.
final request = await cache
.from<PayoutSettings, Map>("payout-settings")
.withAsync(() => fetchPayoutSettingsFromServer()) // Replace with your async function
.withStrategy(AsyncOrCacheStrategy())
.execute();
To clear the cache, you can use the clear method of the RxCacheManager instance. You can optionally specify a prefix to clear only specific cached items. Here's how you can clear the cache and retrieve cache size:
void main() async {
final cache = RxCacheManager(CacheStorage("default"));
// Clear the entire cache
await cache.clear();
// Get the entire cache size
int size = await cache.size();
// Clear cache with a specific prefix
await cache.clear(prefix: "payout-settings");
// Other code...
}
The code was written by Michael Piper (https://github.com/michaelpiper) Contributions to the RxCacheManager package are welcome! If you encounter any issues or have suggestions for improvements, please open an issue or submit a pull request.
This package is released under the MIT License.
RxCacheManager provides a powerful caching solution for your Flutter applications. By defining caching strategies and using serializers, you can efficiently cache and retrieve data, improving the performance and responsiveness of your app. For more information and advanced usage, check the full API documentation and examples.
Happy coding!