美文网首页
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