在创建窗口小部件树时,在静态窗口小部件之前插入const会提高性能吗?
即
child: const Text('This is some text');vs
child: Text('This is some text');我知道,在Dart 2中,const是可选的,并且会在某些地方自动插入。这是其中一种情况吗?如果不是,使用const会减少内存使用/提高性能吗?
感谢您的回答!
发布于 2018-11-27 13:39:00
这是一个小的性能改进,但它可以增加更大的应用程序或应用程序,例如因为动画而经常重建视图的应用程序。
const减少了垃圾收集器所需的工作。
您可以在analysis_options.yaml中启用一些链接器规则,这些规则会告诉您何时应该添加const,因为它不是推断出来的,但可能如下所示
或者,这会在您使用const时提醒您,但无论如何都是推断出来的
另请参阅https://www.dartlang.org/guides/language/analysis-options
发布于 2018-11-27 16:39:35
在Flutter的情况下,const的实际收益并不是具有更少的实例化。当小部件的实例没有改变时,Flutter有一个特殊的处理方式:它不会重新构建它们。
请考虑以下几点:
Foo(
child: const Bar(
child: Baz()
),
)在再次调用build方法(setState、parent rebuild、Inheritedwidget...)的情况下,由于const的Bar子树,只有Foo将看到其build方法被调用。
Bar永远不会因为它的父级而重新构建,因为Flutter知道既然小部件实例没有更改,就没有什么需要更新的。
发布于 2020-07-10 07:45:19
我注意到我最近得到了好评,我必须说我对下面的测试没有信心,但这就是我得到的全部。所以最好有人做个更好的测试。
我已经运行了一些测试,看看它是否会有所不同。
这些测试在很大程度上基于在this article中完成的测试。
对于测试,有300个容器,里面的文本在屏幕上随机移动。一些你在日常应用中看不到的东西。
对于我的结果,每秒帧数和内存使用量没有区别,只是垃圾收集器在不使用const时似乎运行得更频繁。同样,FPS也大致相同。

在Imo中,性能提升可以忽略不计,听起来像是抢占式优化。然而,测试中没有嵌套很深的小部件链,但我看不出这会有什么不同。上面的文章似乎说有一个小的,但这不是我的测试显示的。
我有一张这样的卡片(这是const版本):
import 'package:flutter/material.dart';
class MyCard extends StatelessWidget {
const MyCard();
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
margin: const EdgeInsets.all(8.0),
height: 100,
width: 100,
color: Colors.red,
child: const Text('Hi'),
),
);
}
}它被渲染了300次,并在屏幕上随机移动。
这就是让他们移动的小部件
import 'package:flutter/material.dart';
import 'dart:math';
import 'dart:async';
import './my-card.dart';
class MovingContainer extends StatefulWidget {
@override
_MovingContainerState createState() => _MovingContainerState();
}
class _MovingContainerState extends State<MovingContainer> {
final Random _random = Random();
final Duration _duration = const Duration(milliseconds: 1000);
Timer _timer;
double _top = 0;
double _left = 0;
@override
void initState() {
super.initState();
initMove();
}
void initMove() {
_timer = Timer.periodic(
_duration,
(timer) {
move();
},
);
}
void move() {
final Size size = MediaQuery.of(context).size;
setState(() {
_top = _random.nextInt(size.height.toInt() - 100).toDouble();
_left = _random.nextInt(size.width.toInt() - 100).toDouble();
});
}
@override
void dispose() {
_timer.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return AnimatedPositioned(
top: _top,
left: _left,
child: const MyCard(),
duration: _duration,
);
}
}注意:我刚开始接触flutter,其他许多人也是如此,因为它是一个相对较新的框架。因此,我的测试很可能是错误的,不要把它当作福音。当你读到一篇题为<< Number One Perf gain on Flutter >>的文章时,也不要把它当做福音。我还没有看到有实际的证据,有性能上的收益。先发制人的优化是一个容易陷入的甜蜜谬误。
https://stackoverflow.com/questions/53492705
复制相似问题