关于渲染首先要注意的一件事是:重建和重新绘制是不一样的。重建涉及布局和绘画,而重新绘画不涉及重新布局。
在您感兴趣的print
任何方法中添加声明。build
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
print('MyApp building'); <-- this
return MaterialApp(...
Run Code Online (Sandbox Code Playgroud)
和这个:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
print('MyApp building'); <-- this
return MaterialApp(...
Run Code Online (Sandbox Code Playgroud)
如果您注意到小部件树中不必要的部分被重建,那么解决方案是提取树中正在更改为自己的小部件的部分,最好是const
小部件。
要查看重新绘制的内容,您可以使用Dart DevTools。当您的应用程序运行时,单击“重新绘制彩虹”按钮。
或者,您可以在代码中使用以下标志:
class MyWidget extends StatelessWidget {
const MyWidget({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
print('MyWidget building'); // <-- here
return ProgressBar(...
Run Code Online (Sandbox Code Playgroud)
正在重新绘制的区域有一个彩虹边框,每次重新绘制时都会改变颜色。正如您在下面的动画中看到的,整个窗口每次都会被重新绘制。(中心的蓝线是小部件的一部分,而不是重绘彩虹。)
如果您想限制绘制的内容,可以将 RepaintBoundary 小部件添加到树中,如下所示:
void main() {
debugRepaintRainbowEnabled = true; // <-- set this flag to true
runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)
现在,当您使用 DevTools 并选择 Repaint Rainbow 按钮时,您将看到只有 ProgressBar 小部件被重新绘制。
如果重新喷漆并不昂贵,那么这可能不是您需要担心的事情。至少在我见过的大多数文档中,人们都说要最小化重建,但几乎没有人建议添加重绘边界。我会检查 DartDev 工具中的时间表和性能,看看您是否需要它。查看下面的链接视频了解详细信息。
也可以看看:
在 flutter 中,每当一个小部件更新时;整个小部件树重新绘制。所以不行。
但是您也可以通过在树中插入一个RepaintBoundary
小部件来手动引入“重新绘制边界”。这明确告诉 flutter 为其子级创建一个新的绘画层(这意味着内存缓存)。这样,每当该子级更新时,它也不会重新绘制其父级。
您可以做的是在重新绘制 RepaintBoundary 时进行调试。
为此,您可以通过以下方式启用重绘彩虹:
t
使用时按下flutter run
Dart Code
扩展ctrl/cmd + shift + p
enable repaint rainbow
归档时间: |
|
查看次数: |
4629 次 |
最近记录: |