实践小结

[toc]

一、对比[MVC、MVP、BloC、Redux]四种架构

  • MVC、MVP、BloC、Redux四种架构在Flutter上的尝试

    对比[MVC、MVP、BloC、Redux]四种架构的好坏,

    对比[MVC、MVP、BloC、Redux]四种架构的好坏,最终还是的回归到状态管理上来。MVCMVP的状态管理都是采用setState方式,而BloCRedux都有自己的一套状态管理。

    当项目最初不是很复杂的时候,采用setState方式更新数据是可以的。但是随着功能的增加,你的项目将会有几十个甚至上百个状态,setState出现的次数便会显著增加,每次setState都会重新调用build方法,这势必对于性能以及代码的可阅读性带来一定的影响。所以就放弃了MVCMVP这两种架构。

    最初对OpenGit_Flutter进行架构重构的时候,用到的是Redux,到涉及到多个页面复用时,例如项目中的项目页,每涉及到一个复用页面就需要在state内定义一些列的变量,这是个很痛苦的过程,所以后面就放弃了用Redux,但是Redux在保存全局状态有优势,例如主题、语言、用户资料等。后面又尝试了BloC,该架构在多页面复用时,就没存在Redux的问题。

    所以最后我采用的架构是Bloc+Redux,用BloC控制局部状态,用Redux控制全局状态。

单例

Flutter中,dart的单例模式设计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 创建一个单例的Manager类
class Manager {
// 工厂模式
factory Manager() =>_getInstance();
static Manager get instance => _getInstance();
static Manager _instance;
Manager._internal() {
// 初始化
}
static Manager _getInstance() {
if (_instance == null) {
_instance = new Manager._internal();
}
return _instance;
}
}

// 调用
// 无论如何初始化,取到的都是同一个对象
Manager manager = new Manager();
Manager manager2 = Manager.instance;

数据管理

shared_preferences 0.5.8

Flutter sharedPreferences使用

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
import 'package:shared_preferences/shared_preferences.dart';

/// desc:本地储存
class SharedPreferenceUtil {
static const String UserTokenKey = "userTokenKey";

// 异步保存
Future setUserToken(String userToken) async{
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString(UserTokenKey, userToken);
}

// 异步删除
Future delUserToken() async{
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.remove(UserTokenKey);
}

// 异步读取
Future<String> getUserToken() async{
SharedPreferences prefs = await SharedPreferences.getInstance();
String userToken = prefs.getString(UserTokenKey);
print('------userToken = $userToken-----');
return userToken;
}
}



// 使用
// 保存:
SharedPreferenceUtil.setUserToken("usertoken_zhangsan");

// 读取:
Future<String> userTokenFuture = SharedPreferenceUtil.getUserToken();
userTokenFuture.then((String userToken) {
print('------userToken = $userToken-----');
});