Files
AI-Health/health_app/lib/core/navigation_provider.dart
MingNian 335a3e6440 feat: 饮食记录逻辑重构 + 通知管理分隔线修复 + 多页面 UI 调整
- 饮食: 新增 DietCommentaryPolicy + diet_record_logic, 饮食记录逻辑抽取复用
- 通知管理: 分隔线改为仿通知中心样式, 跳过图标区域只留文字下方
- 侧边栏: 对话记录操作栏浮层修复 + 常用功能间距收紧
- 智能体: 欢迎卡片去 400ms 延迟 + 胶囊去阴影
- 后端: AI 会话仓库新增方法 + 饮食评论策略 + 健康记录规则调整
- 其他: api_client IP 适配 + 多页面 UI 微调 + 新增测试
2026-07-12 22:49:38 +08:00

75 lines
1.8 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();
}