Skip to content

UpdateChecker

UpdateChecker 对比已安装插件版本和市场版本,返回有更新的插件列表。用于在 UI 上标红点提示、显示“更新”按钮。

文件:lib/core/market/market_update_checker.dart

class PluginUpdate {
final String pluginId;
final String name;
final String installedVersion;
final String marketVersion;
final MarketDir dir;
}
字段 说明
pluginId 插件 id
name 展示名(来自市场 meta)
installedVersion 当前已安装版本
marketVersion 市场上的最新版本
dir 所在市场目录
class UpdateChecker {
final MarketRepository repository;
final PluginManager manager;
UpdateChecker(this.repository, this.manager);
}
Future<List<PluginUpdate>> checkAll()

检查所有已安装插件。遍历 manager.allPlugins,每个插件按 type 映射到 MarketDir,调 repository.fetchMeta 拿市场版本(走 1 小时缓存),semver 比较后返回有更新的列表。

  • 市场里没有的插件(比如系统默认 Friend)→ 跳过
  • fetchMeta 网络失败 → 跳过那个插件(不中断整个检查)
  • 已安装版本 >= 市场版本 → 不加入列表
final checker = UpdateChecker(repository, manager);
final updates = await checker.checkAll();
for (final u in updates) {
print('${u.name}: ${u.installedVersion} → ${u.marketVersion}');
}
Future<PluginUpdate?> checkOne(String pluginId)

检查单个插件。无更新或不在市场返回 null。

final update = await checker.checkOne('moodpet.friend.default_smiley');
if (update != null) {
print('有新版本: ${update.marketVersion}');
}

semver-ish 比较:

  1. 剥掉 -prerelease 和 +build 后缀
  2. 按 . 分割成段
  3. 逐段比较:都是数字则数字比较,否则字符串比较
  4. 段数不够的补 "0"
_isNewer('1.2.0', '1.1.0') // true
_isNewer('1.0.0', '1.0.0') // false
_isNewer('2.0.0', '1.9.9') // true
_isNewer('1.10.0', '1.9.0') // true(数字比较,不是字符串)

不是严格的 semver 实现——不支持 prerelease 优先级。够用就行。别用 1.0.0-beta 这种格式,-beta 会被剥掉导致和 1.0.0 比较结果不确定。

启动时检查更新:

final checker = UpdateChecker(repository, manager);
final updates = await checker.checkAll();
if (updates.isNotEmpty) {
// 在 UI 某处显示红点
showUpdateBadge(updates.length);
}

在 Riverpod 里(实际实现):

final marketUpdatesProvider = FutureProvider<List<PluginUpdate>>((ref) async {
final checker = await ref.watch(updateCheckerProvider.future);
return checker.checkAll();
});
// UI:
final hasUpdates = ref.watch(marketUpdatesProvider).maybeWhen(
data: (updates) => updates.isNotEmpty,
orElse: () => false,
);