MST

星途 面试题库

面试题:Flutter异步加载数据缓存策略中的缓存更新机制

当数据发生变化时,在Flutter的异步加载数据缓存策略里,如何优雅地更新缓存数据以保证数据的一致性?请举例说明使用缓存版本控制或事件驱动机制来实现这一过程,并解释相关代码的原理。
24.8万 热度难度
前端开发Flutter

知识考点

AI 面试

面试题答案

一键面试

使用缓存版本控制

  1. 原理
    • 为缓存数据设置一个版本号。当数据发生变化时,更新版本号。每次加载数据时,先检查本地缓存的版本号与服务器端(或数据源)的版本号是否一致。如果不一致,说明数据已更新,需要重新加载数据并更新缓存。
  2. 示例代码
class DataCache {
  int _version = 0;
  dynamic _cachedData;

  Future<dynamic> fetchData() async {
    // 模拟从服务器获取数据和版本号
    int serverVersion = await _getServerVersion();
    dynamic serverData = await _getServerData();

    if (serverVersion > _version) {
      _version = serverVersion;
      _cachedData = serverData;
      return serverData;
    } else {
      return _cachedData;
    }
  }

  Future<int> _getServerVersion() async {
    // 实际实现从服务器获取版本号
    return Future.delayed(const Duration(seconds: 1), () => 1);
  }

  Future<dynamic> _getServerData() async {
    // 实际实现从服务器获取数据
    return Future.delayed(const Duration(seconds: 1), () => {'key': 'value'});
  }
}

使用事件驱动机制

  1. 原理
    • 利用事件总线(Event Bus),当数据发生变化时,发布一个事件。订阅了该事件的组件或服务收到事件后,更新缓存数据。这样可以解耦数据更新的触发和缓存更新的逻辑。
  2. 示例代码
import 'package:event_bus/event_bus.dart';

final EventBus eventBus = EventBus();

class DataUpdatedEvent {}

class DataCache {
  dynamic _cachedData;

  DataCache() {
    eventBus.on<DataUpdatedEvent>().listen((event) {
      _updateCache();
    });
  }

  Future<dynamic> fetchData() async {
    if (_cachedData == null) {
      await _updateCache();
    }
    return _cachedData;
  }

  Future<void> _updateCache() async {
    // 模拟从服务器获取数据
    _cachedData = await _getServerData();
  }

  Future<dynamic> _getServerData() async {
    // 实际实现从服务器获取数据
    return Future.delayed(const Duration(seconds: 1), () => {'key': 'value'});
  }
}

// 数据更新时发布事件
void updateData() {
  eventBus.fire(DataUpdatedEvent());
}

在上述示例中,缓存版本控制通过比较版本号来决定是否更新缓存,而事件驱动机制通过事件总线发布和监听事件来触发缓存更新。两者都能在数据变化时优雅地更新缓存数据以保证一致性。