Returns the cached response for key, or null on a miss.
key
@override Future<String?> read(String key) async { final file = _fileFor(key); if (!await file.exists()) return null; return file.readAsString(); }