Flutter 静态属性不更新问题 2022-12-05 周一
2022-12-05 本文已影响0人
勇往直前888
问题举例
static List genderList = [
{
'name': 'Male'.tr,
'id': 0,
'select': false,
'disable': false,
},
{
'name': 'Female'.tr,
'id': 1,
'select': false,
'disable': false,
},
];
上面这段代码,逻辑上是没有问题的。name字段,取值加了个.tr后缀,是Gets多语言加上去的。id字段用来操作,值固定。name字段用来显示,语言切换的的时候,内容需要改变。
但是,实际上,这段代码的name字段会固定不变。并不能跟随语言变化而变化。
原因推测
数组是引用类型,静态变量genderList在第一次创建的时候,会执行类似'Male'.tr
之类的函数,把结果,比如男
填进去。这样的话,整个数组就是一个常量了。这样能提高效率。
下次访问genderList时候,不会再执行函数了,直接返回函数执行的结果(男
)。
这样导致的问题,就是静态变量一旦赋值,将不会更新。
当然,给genderList重新赋值会重新计算的。但是,内部子字段的变化是不会生效的。
这种行为,是Dart语言本身的缺陷。
怎么解决?
可以考虑用get属性代替
static List get genderList => [
{
'name': 'Male'.tr,
'id': 0,
'select': false,
'disable': false,
},
{
'name': 'Female'.tr,
'id': 1,
'select': false,
'disable': false,
},
];
这样的话,跟静态变量使用的方式一致,但是get属性本质上函数,每次都会重新执行,重新计算,从而也就能够及时更新了。当然,相对地,效率会稍微差一点。
如何选择?
-
如果是常量,那么可以用静态属性。最好显示加上const或者final关键字。
-
如果需要更新,比如多语言,主题切换等,可以考虑用静态的get来替代。这个本质是函数,能够根据需求切换。
-
抛开static关键字,是普通的属性,但是写成了单例模式(用static或者继承Gets的GetXService),这种无法更新的问题仍然存在。
-
所以,static的属性要慎用,如果非要用的话,可以考虑加个get关键字改为函数,使用的地方和static属性一样。