首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在小部件树中使用const可以提高性能吗?

在小部件树中使用const可以提高性能吗?
EN

Stack Overflow用户
提问于 2018-11-27 12:20:38
回答 4查看 10.5K关注 0票数 52

在创建窗口小部件树时,在静态窗口小部件之前插入const会提高性能吗?

代码语言:javascript
复制
child: const Text('This is some text');

vs

代码语言:javascript
复制
child: Text('This is some text');

我知道,在Dart 2中,const是可选的,并且会在某些地方自动插入。这是其中一种情况吗?如果不是,使用const会减少内存使用/提高性能吗?

感谢您的回答!

EN

回答 4

Stack Overflow用户

发布于 2018-11-27 13:39:00

这是一个小的性能改进,但它可以增加更大的应用程序或应用程序,例如因为动画而经常重建视图的应用程序。

const减少了垃圾收集器所需的工作。

您可以在analysis_options.yaml中启用一些链接器规则,这些规则会告诉您何时应该添加const,因为它不是推断出来的,但可能如下所示

或者,这会在您使用const时提醒您,但无论如何都是推断出来的

另请参阅https://www.dartlang.org/guides/language/analysis-options

票数 42
EN

Stack Overflow用户

发布于 2018-11-27 16:39:35

在Flutter的情况下,const的实际收益并不是具有更少的实例化。当小部件的实例没有改变时,Flutter有一个特殊的处理方式:它不会重新构建它们。

请考虑以下几点:

代码语言:javascript
复制
Foo(
  child: const Bar(
    child: Baz() 
  ),
)

在再次调用build方法(setState、parent rebuild、Inheritedwidget...)的情况下,由于constBar子树,只有Foo将看到其build方法被调用。

Bar永远不会因为它的父级而重新构建,因为Flutter知道既然小部件实例没有更改,就没有什么需要更新的。

票数 25
EN

Stack Overflow用户

发布于 2020-07-10 07:45:19

我注意到我最近得到了好评,我必须说我对下面的测试没有信心,但这就是我得到的全部。所以最好有人做个更好的测试。

我已经运行了一些测试,看看它是否会有所不同。

这些测试在很大程度上基于在this article中完成的测试。

对于测试,有300个容器,里面的文本在屏幕上随机移动。一些你在日常应用中看不到的东西。

对于我的结果,每秒帧数和内存使用量没有区别,只是垃圾收集器在不使用const时似乎运行得更频繁。同样,FPS也大致相同。

在Imo中,性能提升可以忽略不计,听起来像是抢占式优化。然而,测试中没有嵌套很深的小部件链,但我看不出这会有什么不同。上面的文章似乎说有一个小的,但这不是我的测试显示的。

我有一张这样的卡片(这是const版本):

代码语言:javascript
复制
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次,并在屏幕上随机移动。

这就是让他们移动的小部件

代码语言:javascript
复制
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 >>的文章时,也不要把它当做福音。我还没有看到有实际的证据,有性能上的收益。先发制人的优化是一个容易陷入的甜蜜谬误。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53492705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档