Flutter面试题2025——架构与设计模式(10)

一 概述

  1. 你熟悉哪些架构模式?(MVC、MVP、MVVM、BLoC/Cubit、Redux/Flux)
  2. 如何为Flutter项目选择合适的架构?
  3. 什么是SOLID原则?它们如何应用于Flutter开发?
  4. 什么是依赖注入?如何在Flutter中实现它?

二 面试题解答(仅供参考)

2.1 你熟悉哪些架构模式?(MVC、MVP、MVVM、BLoC/Cubit、Redux/Flux)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
我熟悉以下几种常见的架构模式,它们在 Flutter 或其他前端开发中被广泛使用:

1. MVC(Model-View-Controller)
-Model:数据和业务逻辑
-View:界面展示
-Controller:协调 Model 和 View
-特点:逻辑清晰,但在 Flutter 中不常单独使用

2. MVP(Model-View-Presenter)
-Model:数据逻辑
-View:UI 层,接口化
-Presenter:处理逻辑并更新 View
-特点:解耦较好,适合复杂交互

3. MVVM(Model-View-ViewModel)
-Model:数据源
-View:UI 层
-ViewModel:状态和业务逻辑,中间桥梁
-特点:常用于绑定式架构,适合 Flutter + Riverpod、Provider 等

4. BLoC / Cubit
-BLoC(Business Logic Component):通过 Stream 管理状态和事件
-Cubit:简化版 BLoC,仅管理状态(不处理事件)
-特点:解耦清晰、适合大型项目、测试友好

5. Redux / Flux
-Redux:统一状态存储 + 中央数据流
-Flux:Redux 的前身
-特点:可预测性高,适合数据流复杂的大型项目,但学习曲线陡

2.2 如何为Flutter项目选择合适的架构?

一、概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
为 Flutter 项目选择合适的架构,关键是根据项目的规模、复杂度、团队能力等因素进行权衡。

一、选择架构时的考虑因素:
1. 项目复杂度
-小型项目或原型:使用简单架构如 MVVM + Provider 或 Cubit 更高效。
-中大型项目:推荐使用 BLoC 或 Redux,结构清晰、可测试性强。

2. 团队熟悉度
-如果团队熟悉某种架构(如 Android 开发者熟悉 MVP/MVVM),可选择类似架构在 Flutter 中实现。

3. 状态管理需求
-数据是否需要跨页面共享?是否需要精细控制重建?
-可以考虑 Provider、Riverpod、BLoC 等配套状态管理方案。

4.可维护性与扩展性
-想保持高可维护性与分层清晰,推荐使用如 BLoC 或 Clean Architecture。

5. 测试需求
若有较强测试需求(如单元测试、UI测试),选用 BLoC、MVVM 等分层明确架构更合适。

二、 常见选择建议

项目类型 推荐架构
Demo/个人项目 MVVM + Provider/Cubit
中型企业项目 MVVM + Riverpod 或 BLoC
大型复杂项目 Clean Architecture + BLoC/Redux

2.3 什么是SOLID原则?它们如何应用于Flutter开发?

一、概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SOLID 原则是面向对象编程中五个设计原则的缩写,用于构建可维护、可扩展、低耦合的系统。
在 Flutter 开发中同样适用,特别是在架构设计、状态管理和模块拆分中。

一、SOLID 五大原则:
1.1、S - 单一职责原则(Single Responsibility Principle)
-每个类只负责一个功能。
-在 Flutter 中:把 UI、业务逻辑、网络请求分开写,避免“大杂烩”组件。

1.2、O - 开闭原则(Open/Closed Principle)
-类对扩展开放,对修改关闭。
-在 Flutter 中:通过继承或组合来扩展功能,而不是修改原有代码。

1.3、L - 里氏替换原则(Liskov Substitution Principle)
-子类可以替代父类出现的地方。
-在 Flutter 中:可以安全地将自定义组件替代抽象组件或接口。

1.4、I - 接口隔离原则(Interface Segregation Principle)
-使用多个小接口,而不是一个大接口。
-在 Flutter 中:拆分接口职责,让类只实现自己需要的接口(如多个功能模块接口)。

1.5、D - 依赖倒置原则(Dependency Inversion Principle)
-高层模块不依赖低层模块,依赖抽象。
-在 Flutter 中:使用接口+依赖注入(如 get_it)来解耦逻辑和实现。

二、总结:

原则 在 Flutter 中的体现
SRP UI 与逻辑分离
OCP 通过扩展 widget/logic 而不是修改
LSP 自定义类/控件可无缝替代父类
ISP 控制模块边界,接口粒度合理
DIP 使用依赖注入管理依赖关系

2.4 什么是依赖注入?如何在Flutter中实现它?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
一、概念
依赖注入(Dependency Injection, 简称 DI)是一种设计模式,
用于将对象所依赖的其他对象,通过外部方式传入,而不是在类内部自己创建,从而实现解耦、易测试、易维护

二、 在 Flutter 中如何实现依赖注入:
2.1、 手动注入(构造函数注入)
通过构造函数传入依赖对象:

class UserService {
final ApiClient apiClient;

UserService(this.apiClient);
}

2.2、 使用 Provider 包
通过 Provider 注册并提供依赖:
void main() {
runApp(
Provider(
create: (_) => ApiClient(),
child: MyApp(),
),
);
}
// 在子组件中获取依赖
final api = Provider.of<ApiClient>(context);

2.3. 使用 get_it(Flutter 中最常用的 DI 工具)
final getIt = GetIt.instance;
void setup() {
getIt.registerSingleton<ApiClient>(ApiClient());
}
// 使用
final api = getIt<ApiClient>();

三、优点:
-解耦:业务逻辑和依赖对象分离
-易测试:可以注入 mock 对象进行单元测试
-灵活扩展:切换依赖无需修改类本身

四、总结:
依赖注入是一种通过“外部提供依赖”来减少耦合的模式,
Flutter 中常用 Provider 或 get_it 实现它,在中大型项目中尤为重要。