Files
nj/app/lib/features/parent/bloc/parent_bloc.dart
iven e57c3427a4 fix(app): 18 处 catch(e) 添加 debugPrint 异常日志
- parent_bloc: 6 处 (LoadChildren/BindChild/ViewJournals/ExportData/DeleteData/UnbindChild)
- search_bloc: 3 处 (SearchByMood/SearchByTag/SearchByKeyword)
- achievement_bloc: 1 处 (_fetchAchievements)
- sticker_bloc: 2 处 (_fetchPacks/fetchStickersInPack)
- template_bloc: 1 处 (_fetchTemplates)
- mood_bloc: 1 处 (_loadStats)
- home_bloc: 1 处 (_onLoadData)
- calendar_bloc: 1 处 (_onMonthChanged)
- sync_engine: 1 处 (trySync)
- weekly_page: 已有 debugPrint,无需修改
2026-06-02 23:21:16 +08:00

148 lines
4.3 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 家长中心 BLoC — 管理家长-孩子绑定和数据操作
//
// 状态机: ParentInitial → ParentLoading → ParentChildrenLoaded / ParentJournalsLoaded / ParentDataExported / ParentDataDeleted / ParentError
// API: /diary/parent/* 端点
import 'package:flutter/foundation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../data/remote/api_client.dart';
part 'parent_event.dart';
part 'parent_state.dart';
/// 家长中心 BLoC — 处理孩子绑定、日记查看、数据导出/删除
class ParentBloc extends Bloc<ParentEvent, ParentState> {
final ApiClient _api;
ParentBloc({required ApiClient api})
: _api = api,
super(const ParentInitial()) {
on<ParentLoadChildren>(_onLoadChildren);
on<ParentBindChild>(_onBindChild);
on<ParentViewJournals>(_onViewJournals);
on<ParentExportData>(_onExportData);
on<ParentDeleteData>(_onDeleteData);
on<ParentUnbindChild>(_onUnbindChild);
}
/// 加载已绑定的孩子列表
Future<void> _onLoadChildren(
ParentLoadChildren event,
Emitter<ParentState> emit,
) async {
emit(const ParentLoading());
try {
final response = await _api.get('/diary/parent/children');
final body = response.data as Map<String, dynamic>;
final items = body['data'] as List? ?? [];
final children = items
.map((j) => ChildBinding.fromJson(j as Map<String, dynamic>))
.toList();
emit(ParentChildrenLoaded(children));
} catch (e) {
debugPrint('ParentBloc._onLoadChildren 失败: $e');
emit(const ParentError('加载孩子列表失败'));
}
}
/// 绑定孩子(输入孩子 ID
Future<void> _onBindChild(
ParentBindChild event,
Emitter<ParentState> emit,
) async {
emit(const ParentLoading());
try {
await _api.post('/diary/parent/bind', data: {
'child_id': event.childId,
});
// 绑定成功后重新加载列表
add(const ParentLoadChildren());
} catch (e) {
debugPrint('ParentBloc._onBindChild 失败: $e');
emit(const ParentError('绑定失败,请检查孩子 ID'));
}
}
/// 查看孩子日记(只读)
Future<void> _onViewJournals(
ParentViewJournals event,
Emitter<ParentState> emit,
) async {
emit(const ParentLoading());
try {
final response = await _api.get(
'/diary/parent/journals',
queryParams: {
'child_id': event.childId,
'page': 1,
'page_size': 50,
},
);
final body = response.data as Map<String, dynamic>;
final items = body['data'] as List? ?? [];
emit(ParentJournalsLoaded(
childId: event.childId,
journals: items.cast<Map<String, dynamic>>(),
));
} catch (e) {
debugPrint('ParentBloc._onViewJournals 失败: $e');
emit(const ParentError('加载日记失败'));
}
}
/// 导出孩子数据PIPL 合规)
Future<void> _onExportData(
ParentExportData event,
Emitter<ParentState> emit,
) async {
emit(const ParentLoading());
try {
final response = await _api.get(
'/diary/parent/export',
queryParams: {'child_id': event.childId},
);
emit(ParentDataExported(
childId: event.childId,
data: response.data as Map<String, dynamic>,
));
} catch (e) {
debugPrint('ParentBloc._onExportData 失败: $e');
emit(const ParentError('导出失败'));
}
}
/// 删除孩子数据PIPL 合规,需二次确认)
Future<void> _onDeleteData(
ParentDeleteData event,
Emitter<ParentState> emit,
) async {
emit(const ParentLoading());
try {
await _api.delete('/diary/parent/data', data: {
'child_id': event.childId,
});
emit(ParentDataDeleted(event.childId));
} catch (e) {
debugPrint('ParentBloc._onDeleteData 失败: $e');
emit(const ParentError('删除失败'));
}
}
/// 解绑孩子
Future<void> _onUnbindChild(
ParentUnbindChild event,
Emitter<ParentState> emit,
) async {
try {
await _api.delete('/diary/parent/bind', data: {
'child_id': event.childId,
});
add(const ParentLoadChildren());
} catch (e) {
debugPrint('ParentBloc._onUnbindChild 失败: $e');
emit(const ParentError('解绑失败'));
}
}
}