import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../api/ai_api.dart'; import '../core/storage/local_storage.dart'; import '../models/ai_config.dart'; /// 可选的 AI 配置列表(含虚拟的「默认」项) final aiConfigsProvider = FutureProvider.autoDispose>((ref) { return ref.watch(aiApiProvider).configs(); }); /// 当前选中的配置。 /// /// **不设 autoDispose**:用户在设置页选完,回到对话页要立刻生效; /// 而且这是本地状态,重新读一遍没什么成本,但保持常驻能避免 /// 「切个页面选择就丢了」这种困惑。 class SelectedAiConfigNotifier extends Notifier { @override int? build() { // 存的就是「真实 id」,null = 用默认。 // 默认项在列表里的 id 也是 null,两边语义天然一致。 return LocalStorage.instance.getAiConfigId(); } void select(int? id) { state = id; LocalStorage.instance.saveAiConfigId(id); } } final selectedAiConfigProvider = NotifierProvider(SelectedAiConfigNotifier.new); /// 从配置列表里挑出当前选中的那一条。 /// /// 三种情况都要兜住: /// · 还没选过 → 用列表第一项(也就是「默认」) /// · 选过但那条被删了 → 退回第一项,并顺手把本地选择改掉 /// · 列表还没加载出来 → 返回 null,界面显示「--」 final activeAiConfigProvider = Provider.autoDispose((ref) { final configs = ref.watch(aiConfigsProvider).value; if (configs == null || configs.isEmpty) return null; final selectedId = ref.watch(selectedAiConfigProvider); if (selectedId == null) return configs.first; for (final item in configs) { if (item.selectionKey == selectedId) return item; } // 选中的那条已经不存在了(被删了)。退回默认。 // 放在微任务里改 state —— build 过程中不能同步改另一个 provider。 Future.microtask(() { ref.read(selectedAiConfigProvider.notifier).select(null); }); return configs.first; });