美文网首页
Flutter 静态属性不更新问题 2022-12-05 周一

Flutter 静态属性不更新问题 2022-12-05 周一

作者: 松哥888 | 来源:发表于2022-12-05 16:06 被阅读0次

问题举例

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属性一样。

相关文章

网友评论

      本文标题:Flutter 静态属性不更新问题 2022-12-05 周一

      本文链接:https://www.haomeiwen.com/subject/mkuvfdtx.html