UpdateChecker
UpdateChecker
Section titled “UpdateChecker”UpdateChecker 对比已安装插件版本和市场版本,返回有更新的插件列表。用于在 UI 上标红点提示、显示“更新”按钮。
文件:lib/core/market/market_update_checker.dart
PluginUpdate
Section titled “PluginUpdate”class PluginUpdate { final String pluginId; final String name; final String installedVersion; final String marketVersion; final MarketDir dir;}| 字段 | 说明 |
|---|---|
pluginId |
插件 id |
name |
展示名(来自市场 meta) |
installedVersion |
当前已安装版本 |
marketVersion |
市场上的最新版本 |
dir |
所在市场目录 |
UpdateChecker
Section titled “UpdateChecker”class UpdateChecker { final MarketRepository repository; final PluginManager manager;
UpdateChecker(this.repository, this.manager);}checkAll
Section titled “checkAll”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}');}checkOne
Section titled “checkOne”Future<PluginUpdate?> checkOne(String pluginId)检查单个插件。无更新或不在市场返回 null。
final update = await checker.checkOne('moodpet.friend.default_smiley');if (update != null) { print('有新版本: ${update.marketVersion}');}semver-ish 比较:
- 剥掉
-prerelease和+build后缀 - 按
.分割成段 - 逐段比较:都是数字则数字比较,否则字符串比较
- 段数不够的补
"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,);