今天,我来到了以下代码片段,实现梯度Flutter
return new Container(
...
decoration: new BoxDecoration(
gradient: new LinearGradient(
colors: [
const Color(0xFF3366FF),
const Color(0xFF00CCFF),
]
begin: const FractionalOffset(0.0, 0.0),
end: const FractionalOffset(1.0, 0.0),
stops: [0.0, 1.0],
tileMode: TileMode.clamp
),
),
),
它提出了两个问题:
1)0xFF3366FF
是什么颜色系统?它看起来有点像HEX,但它不是。
2)为什么const
用于const Color()
而不是new Color()
我理解两者之间的不同,但const在这里对我来说感觉不直观,我希望它创建一个new Color()
类示例,类似于我们如何使用new Text("Some text")
。如果它需要const,为什么TileMode.clamp
不也是const?
3条答案
按热度按时间bbuxkriu1#
从Flutter源
const
示例已规范化。如果代码中有多个
const Color(0xFF00CCFF)
,则只会创建一个示例。const
示例在编译时被评估。在Dart VM中,这是加载代码的时候,但在Flutter生产中使用AoT编译,因此const值提供了一个小的性能优势。另请参阅const构造函数实际上是如何工作的?
8i9zcol22#
正如公认的答案所解释的那样,
const
构造函数是一个小优化。在dart中,即使调用了数百次,
const MyObject(42)
也只分配一次。这意味着更少的内存分配〉更快好吧,从dart的Angular 来看,是的。但是我们在这里有点混乱。我们还有一个Widget树,它也可以使用
const
构造函数。这意味着我们可以将您的代码示例更改为如下内容:在这里,由于
Color
是一个常量,我们设法得到一个常量LinearGradient
,最终得到一个常量DecoratedBox
小部件。但多亏了widget的不可变性;Flutter将识别出小部件是相同的。后果:
DecoratedBox
的整个子树将构建一次。RenderDecoratedBox
)将根本不会更新,即使它的父容器发生更改确切地说,这在“Flutter的分层设计”视频谈话中有解释。但我建议从here开始视频,以更好地理解跳过的内容。
PS:有些小部件根本没有
const
构造函数 *。例如Container
。但是在Container
的情况下,你可以简单地使用DecoratedBox
来代替,这基本上是Container
在幕后使用的。这里的优点是DecoratedBox
* 有一个const构造函数。f0brbegy3#