50 lines
1.2 KiB
Markdown
50 lines
1.2 KiB
Markdown
|
|
# LinksyApp 强制依赖 ChatBloc
|
|||
|
|
|
|||
|
|
## 问题描述
|
|||
|
|
|
|||
|
|
`LinksyApp` (app.dart) 作为应用根节点,被迫在 `MultiBlocProvider` 中注入 `ChatBloc`:
|
|||
|
|
|
|||
|
|
```dart
|
|||
|
|
return MultiBlocProvider(
|
|||
|
|
providers: [
|
|||
|
|
BlocProvider<AuthBloc>.value(value: authBloc),
|
|||
|
|
BlocProvider<ChatBloc>(
|
|||
|
|
create: (_) => ChatBloc(apiClient: sl<IApiClient>()),
|
|||
|
|
),
|
|||
|
|
],
|
|||
|
|
...
|
|||
|
|
);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
这导致:
|
|||
|
|
1. 应用启动时就创建 `ChatBloc` 实例(内存浪费)
|
|||
|
|
2. `LinksyApp` 需要知道"存在 ChatBloc 这个 Feature"
|
|||
|
|
3. 违反单一职责原则:根节点应只负责全局配置,不应了解具体 Feature
|
|||
|
|
|
|||
|
|
## 根本原因
|
|||
|
|
|
|||
|
|
`HomeScreen` 是默认首页,其内部需要 `ChatBloc`。为了让它通过 `context.read<ChatBloc>()` 获取,被迫在根节点提供。
|
|||
|
|
|
|||
|
|
## 正确做法
|
|||
|
|
|
|||
|
|
ChatBloc 应该在路由级别按需注入:
|
|||
|
|
|
|||
|
|
```dart
|
|||
|
|
GoRoute(
|
|||
|
|
path: '/',
|
|||
|
|
builder: (context) => BlocProvider(
|
|||
|
|
create: (_) => ChatBloc(apiClient: sl<IApiClient>()),
|
|||
|
|
child: const HomeScreen(),
|
|||
|
|
),
|
|||
|
|
)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 相关文件
|
|||
|
|
|
|||
|
|
- `apps/lib/app/app.dart`
|
|||
|
|
- `apps/lib/features/home/presentation/screens/home_screen.dart`
|
|||
|
|
|
|||
|
|
## 修复优先级
|
|||
|
|
|
|||
|
|
**中等** - 功能正常但架构不合理,属于技术债
|