- 后端: 新增 AttachmentContextBuilder 解析图片/PDF 摘要并拼入 LLM 上下文; ai_chat_endpoints 扩展附件接口; 新增 ReportAnalysisService - 前端: 新增历史会话页与 conversation_history_provider; chat 链路支持附件展示与回放 - UI: 重构 medication_checkin / notification_center / profile / health_drawer 等多页面 - 配置: api_client baseUrl 适配当前 WiFi IP
65 lines
1.7 KiB
Dart
65 lines
1.7 KiB
Dart
import 'package:flutter/widgets.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
/// 路由信息
|
|
class RouteInfo {
|
|
final String name;
|
|
final Map<String, String> params;
|
|
const RouteInfo(this.name, {this.params = const {}});
|
|
|
|
String param(String key) => params[key] ?? '';
|
|
}
|
|
|
|
/// 路由栈 Notifier
|
|
class RouteStackNotifier extends Notifier<List<RouteInfo>> {
|
|
@override
|
|
List<RouteInfo> build() => [const RouteInfo('login')];
|
|
|
|
void replace(String name, {Map<String, String> params = const {}}) {
|
|
state = [RouteInfo(name, params: params)];
|
|
}
|
|
|
|
void push(String name, {Map<String, String> params = const {}}) {
|
|
state = [...state, RouteInfo(name, params: params)];
|
|
}
|
|
|
|
void pop() {
|
|
if (state.length > 1) {
|
|
state = state.sublist(0, state.length - 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// 路由栈 Provider
|
|
final routeStackProvider =
|
|
NotifierProvider<RouteStackNotifier, List<RouteInfo>>(RouteStackNotifier.new);
|
|
|
|
/// 当前路由
|
|
final currentRouteProvider = Provider<RouteInfo>((ref) {
|
|
final stack = ref.watch(routeStackProvider);
|
|
return stack.last;
|
|
});
|
|
|
|
/// 路由切换前清理键盘焦点,避免返回页面时键盘自动弹起
|
|
void _dismissKeyboard() {
|
|
FocusManager.instance.primaryFocus?.unfocus();
|
|
}
|
|
|
|
/// 跳转(替换整个栈)
|
|
void goRoute(WidgetRef ref, String name, {Map<String, String> params = const {}}) {
|
|
_dismissKeyboard();
|
|
ref.read(routeStackProvider.notifier).replace(name, params: params);
|
|
}
|
|
|
|
/// 推入新页面
|
|
void pushRoute(WidgetRef ref, String name, {Map<String, String> params = const {}}) {
|
|
_dismissKeyboard();
|
|
ref.read(routeStackProvider.notifier).push(name, params: params);
|
|
}
|
|
|
|
/// 返回上一页
|
|
void popRoute(WidgetRef ref) {
|
|
_dismissKeyboard();
|
|
ref.read(routeStackProvider.notifier).pop();
|
|
}
|