为了学习flutter,准备写个APP练手,在网络请求这块准备写个公共参数。 最初定义了一个全局参数paramDic 如下:
// 定义一些公关参数
Map<String,dynamic> paramDic = {
'appType': 'flutter',
'appVersion': '1.0.3',
'androidVersion': '',
'token': UserManager.instance.token != null ? UserManager.instance.token : '',
};
在网络请求时:
var dic = paramDic;
dic['page'] = 1;
dic['size'] = 10;
在另一个网络请求时:
var dic = paramDic;
dic['like_mark'] = 1;
dic['topic_id'] = 10;
越到后面发现怎么接口的参数越来越多,前面的接口的参数都有 这时我意识到这时浅拷贝了,我初始化的dic全部都是paramDic。 然后我给paramDic做了深拷贝;
var dic = Map<String,dynamic>.from(paramDic);
这下该没问题了吧 后面又出现莫名其妙的bug,发表的帖子不能点赞啊什么的 后来经过排查,发现登陆之后存储的token,在paramDic中获取到的并不是登陆中存储的token, 这又是怎么回事。 原来是每次
var dic = Map<String,dynamic>.from(paramDic);
从paramDic中获取公共参数的时候,paramDic中的token并不是实时获取的,paramDic中存的还是全局对象初始化的时候的token。 将paramDic改成实时获取就可以了
// 定义为计算属性
Map<String,dynamic> get paramDic => {
'appType': 'flutter',
'appVersion': '1.0.3',
'androidVersion': '',
'token': UserManager.instance.token != null ? UserManager.instance.token : '',
};
编码需谨慎啊