Flutter apply 方法到静态变量

Flutter apply method to static variable

提问人:Walrus 提问时间:10/16/2022 更新时间:1/16/2023 访问量:713

问:

如何将方法应用于类中的静态变量。flutter 中的某些内置类似乎可以做这样的事情。

class UITextStyle {
  static const TextStyle body = TextStyle(fontSize: 17);

   addColor(Color color) {
    TextStyle style = this as TextStyle;
    style.merge(TextStyle(color: color));
  }
}

然后可以这样称呼:

UITextStyle.body.addColor(Color.fromRGBA(0,0,0,1));

但是,我不能这样调用该方法,因为首先它不是静态的,其次,如果是静态的,我将无法在首先声明后调用它,而只能在 调用它。.bodyUITextStyle.addColor(...)

这是如何实现的?

Flutter 变量方法 静态

评论

0赞 pskink 10/16/2022
它与 ?void main() { Foo.foo.bar('hello world'); } class Foo { static final foo = Foo(); bar(String s) { print(s); } }
0赞 pskink 10/16/2022
啊,你是说你有,而我有?constfinal
0赞 Walrus 10/16/2022
差一点。我只是想写更干净的代码。我可以以不同的方式构建上述类,但您可以以这种方式使用 CupertinoColors 和 CupertinoDynamicColor 等类的方法。CupertinoDynamicColor 可以声明为静态变量,然后可以在行中添加其他方法,例如:CupertinoColors.activeBlue.resolveFrom(context).withOpacity(0.8);我也在尝试像这样在静态变量之后添加方法。
0赞 Walrus 10/16/2022
您的代码适用于该 print 语句。我不能将其应用于合并文本样式。如果我采用 body 的静态变量,则无法将该方法应用于它。您的代码似乎只实现类,而不是静态变量。
0赞 Walrus 10/16/2022
以为我已经明白了。感谢您的代码,它给了我一些关于要寻找什么的很好的提示。

答:

3赞 Walrus 10/16/2022 #1

多亏了@pskink的评论,我最终能够实现这个功能。

class UITextStyle {
  const UITextStyle(this.style);
  final TextStyle style;
  static const body = UITextStyle(TextStyle(fontSize: 17));

  addColor(Color color) {
    TextStyle textStyle = style;
    return textStyle.merge(TextStyle(color: color));
  }
}
3赞 Ahmad Ellamey 10/16/2022 #2

你可以试试这个方案,关键是addColor函数没有定义到TextStyle类型,所以要达到这个目的,你需要通过这个扩展将这个函数添加到TextStyle类中:

extension TextStyleEx on TextStyle{

  TextStyle addColor(Color color) {
    return merge(TextStyle(color: color,fontWeight: FontWeight.w600));
  }

}

并使此方法返回 TextStyle,以便您可以从合并的实例中获取实例,因为您的静态对象是最终的,因此您无法接收到它的新值。

  • 就这样离开你的班级

      class UITextStyle {
        static const TextStyle body = TextStyle(fontSize: 17);
      }
    
  • 使用此类和保存的静态对象获取具有旧 TextStyle 和新 TextStyle 的新 TextStyle。

  • 为了在 main 中测试运行 this,将清除前面的示例:

    TextStyle mergedStyles = UITextStyl.body.addColor(Colors.black);
    print(mergedStyles);
    
2赞 icnahom 10/17/2022 #3

在 Dart 中可以有静态成员。extensions

extension UITextStyle on TextStyle {
  static const body = TextStyle(fontSize: 17);
  
  TextStyle addColor(Color color) {
    return this.merge(TextStyle(color: color));
  }
}
UITextStyle.body.addColor(Color.fromRGBO(0, 0, 0, 1));