feat: 增加AI配置文件与TTS自动朗读,修复二级页面返回按钮与音频播放
This commit is contained in:
@@ -9,6 +9,8 @@ import 'a0_core.dart';
|
||||
import 'generated_content.dart';
|
||||
import 'local_store.dart';
|
||||
import 'seed_courses.dart';
|
||||
import 'ai_config.dart';
|
||||
import 'ai_service.dart';
|
||||
|
||||
class AppState extends ChangeNotifier {
|
||||
static const _storageKey = 'learning_state_v1';
|
||||
@@ -262,6 +264,22 @@ class AppState extends ChangeNotifier {
|
||||
|
||||
Future<void> load() async {
|
||||
try {
|
||||
final config = await AiConfigFile.loadFromAsset();
|
||||
if (config != null) {
|
||||
if (config.apiKey != null && config.apiKey!.trim().isNotEmpty) {
|
||||
AiService.instance.setFallbackApiKey(config.apiKey);
|
||||
}
|
||||
if (aiEndpoint.isEmpty && config.endpoint.isNotEmpty) {
|
||||
aiEndpoint = config.endpoint;
|
||||
}
|
||||
if (aiModel.isEmpty && config.model.isNotEmpty) {
|
||||
aiModel = config.model;
|
||||
}
|
||||
if (aiProvider == AiProviderType.mock &&
|
||||
config.provider != AiProviderType.mock) {
|
||||
aiProvider = config.provider;
|
||||
}
|
||||
}
|
||||
String? raw;
|
||||
if (!_usesLegacyTestStore) {
|
||||
raw = await LocalSnapshotStore.instance.read();
|
||||
@@ -275,6 +293,19 @@ class AppState extends ChangeNotifier {
|
||||
}
|
||||
}
|
||||
if (raw != null) _restore(jsonDecode(raw) as Map<String, dynamic>);
|
||||
if (config != null) {
|
||||
if (aiEndpoint.isEmpty && config.endpoint.isNotEmpty) {
|
||||
aiEndpoint = config.endpoint;
|
||||
}
|
||||
if (aiModel.isEmpty && config.model.isNotEmpty) {
|
||||
aiModel = config.model;
|
||||
}
|
||||
if (aiProvider == AiProviderType.mock &&
|
||||
config.provider != AiProviderType.mock &&
|
||||
raw == null) {
|
||||
aiProvider = config.provider;
|
||||
}
|
||||
}
|
||||
} catch (_) {
|
||||
// A corrupt local cache must never prevent access to offline lessons.
|
||||
} finally {
|
||||
@@ -283,6 +314,19 @@ class AppState extends ChangeNotifier {
|
||||
}
|
||||
}
|
||||
|
||||
Future<bool> reloadAiConfigFromAsset() async {
|
||||
final config = await AiConfigFile.loadFromAsset();
|
||||
if (config == null) return false;
|
||||
aiProvider = config.provider;
|
||||
aiEndpoint = config.endpoint;
|
||||
aiModel = config.model;
|
||||
if (config.apiKey != null && config.apiKey!.trim().isNotEmpty) {
|
||||
AiService.instance.setFallbackApiKey(config.apiKey);
|
||||
}
|
||||
notifyListeners();
|
||||
return true;
|
||||
}
|
||||
|
||||
void _restore(Map<String, dynamic> data) {
|
||||
onboardingComplete =
|
||||
data['onboardingComplete'] as bool? ?? onboardingComplete;
|
||||
|
||||
Reference in New Issue
Block a user