Files
2026-09-28 11:57:54 +08:00

58 lines
2.1 KiB
Dart

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<List<AiConfigItem>>((ref) {
return ref.watch(aiApiProvider).configs();
});
/// 当前选中的配置。
///
/// **不设 autoDispose**:用户在设置页选完,回到对话页要立刻生效;
/// 而且这是本地状态,重新读一遍没什么成本,但保持常驻能避免
/// 「切个页面选择就丢了」这种困惑。
class SelectedAiConfigNotifier extends Notifier<int?> {
@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, int?>(SelectedAiConfigNotifier.new);
/// 从配置列表里挑出当前选中的那一条。
///
/// 三种情况都要兜住:
/// · 还没选过 → 用列表第一项(也就是「默认」)
/// · 选过但那条被删了 → 退回第一项,并顺手把本地选择改掉
/// · 列表还没加载出来 → 返回 null,界面显示「--」
final activeAiConfigProvider = Provider.autoDispose<AiConfigItem?>((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;
});