Baseflow / Baseflow/flutter_cache_manager

When retrieving the cache data few of the special characters are getting corrupted

Abierto
#394 0 comentarios 0 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
Dart
Estrellas
809
Forks
510
Merge medio
6 min
PR fusionados (30 d)
1

Descripción

## 🐛 Bug Report
When retrieving the cache data few of the special characters are getting corrupted

Example char ==== `
### Expected behavior

The data should not be replaced with junk data

### Reproduction steps

insert some string containing ` into the cache and then read it back

### Configuration

**Version:** 3.3.0

**Platform:**
Android and iOS

Example code -

Converting Uint8List to Uint32List may fix the issue

```
class AppCacheManager {
static const _CACHE_KEY = 'AppCacheKey';

/// Maximum number of Cache files saved. If it exceeds the count, files which haven't been used for the longest time will be deleted
static const _MAX_NO_OF_CACHE_OBJECT = 50;

/// Time Duration for a which a file is considered Stale. After this duration file will be deleted.
static const _STALE_PERIOD = const Duration(days: 7);

CacheManager? _cacheManager;
static AppCacheManager? _instance;

AppCacheManager._() {
_cacheManager = (isNativeApp()
? CacheManager(Config(_CACHE_KEY, stalePeriod: _STALE_PERIOD, maxNrOfCacheObjects: _MAX_NO_OF_CACHE_OBJECT))
: null);
}

factory AppCacheManager() {
_instance ??= AppCacheManager._();
return _instance!;
}

/// This method is responsible to return http.StreamedResponse
/// return null in case (file doesn't exist or file validity is expired)
Future getStreamedResponse(String key, http.BaseRequest request,
{bool ignoreMemCache = false}) async {
if (isNativeApp()) {
var cachedFileInfo = await getFileInfoFromCache(key, ignoreMemCache: ignoreMemCache);
if (cachedFileInfo?.file == null) return Future.value(null);
Stream stream = cachedFileInfo!.file.openRead();
return http.StreamedResponse(
stream as Stream>,
HttpStatus.ok,
request: request,
);
}
return Future.value(null);
}

/// This method is responsible to return FileInfo and will also remove the file in case file validity is expired
/// return null in case (Platform is Web, file doesn't exist, file validity is expired)
Future getFileInfoFromCache(String key, {bool ignoreMemCache = false}) async {
/// No FileInfo will be returned in case of Web
if (isNativeApp()) {
var cachedFileInfo = await _cacheManager?.getFileFromCache(key, ignoreMemCache: ignoreMemCache);

/// return null value when cache not found
if (cachedFileInfo?.file == null) {
return Future.value(null);
}
bool isValidityExpired = _isFileValidityExpired(cachedFileInfo!);

/// remove cached file if validity is expired
if (isValidityExpired) {
_cacheManager?.removeFile(key);
return Future.value(null);
}
return Future.value(cachedFileInfo);
}
return Future.value(null);
}

/// method to check file validity
bool _isFileValidityExpired(FileInfo cachedFileInfo) {
return DateTime.now().isAfter(cachedFileInfo.validTill);
}

/// This method is responsible for saving input stream into cache
/// Web Platform not Supported, hence will return null
Future? cacheFile(String url, Stream stream, int validTimeInMilliSeconds) async {
if (isNativeApp()) {
Uint8List bytes = await _toByteStream(stream as Stream>).toBytes();

/// Saving the response to File
await _cacheManager?.putFile(
url,
bytes,
maxAge: Duration(milliseconds: validTimeInMilliSeconds),
);

/// Finished saving the response to file
}
return null;
}

http.ByteStream _toByteStream(Stream> stream) {
if (stream is http.ByteStream) return stream;
return http.ByteStream(stream);
}

Future clearCache() {
return _cacheManager?.emptyCache() ?? Future.value(null);
}
}
```

Guía de contribución

Abrir la guía de contribución

Línea de trabajo

Comienza con la reproducción integrada de AppCacheManager, especialmente con cacheFile y getFileInfoFromCache, y reproduce el recorrido de ida y vuelta en Android o iOS usando una cadena que contenga el carácter especial indicado. Comprueba si los bytes cambian mientras se escriben en la caché o se leen de ella. Se considera terminado cuando la cadena original se devuelve sin cambios después de almacenarla y recuperarla de la caché.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
dart, flutter
Área
mobile
Tipo de issue
Error
Dificultad
3/5
Tiempo estimado
1-2 días
Estado de actividad
Estancado
Claridad
Necesita aclaración
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.