flutter const constructor和no_const constructor有什么区别

iugsix8n  于 2023-08-07  发布在  Flutter
关注(0)|答案(4)|浏览(151)

我是新的Flutter和困惑与它的建设者。
举例来说:

  • 样品1:
class MyContainer extends StatelessWidget {
  final Color color;
  const MyContainer({Key key, this.color}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      color: color,
    );
  }
}

字符串

  • 样品2:
class MyContainer extends StatelessWidget {
  final Color color;
  MyContainer({this.color});

  @override
  Widget build(BuildContext context) {
    return Container(
      color: color,
    );
  }
}


我删除了样本2中的constkey,样本1和样本2都工作得很好。
样本2是否存在潜在风险?

jhkqcmku

jhkqcmku1#

当您不希望重新构建此小部件时,可以使用const构造函数。常量小部件就像常量pi,它不会改变。但是,如果你有state,你想使用示例2中的普通构造函数,因为小部件会改变,不能保持不变。
因此,当你在有意义的地方使用const时,你会得到轻微的性能提升(因为它不会被重建)。
key属性是另一个主题。

kyxcudwk

kyxcudwk2#

  • const*
  • 带有const关键字的变量在compile-time处初始化,并且在runtime处已经赋值。
  • 不能在class中定义const。但是你可以在一个function
  • 对于Flutter特定的,当状态更新时,构建方法中的所有内容都不会再次初始化。
  • const不能在运行时更改。
  • 什么时候使用const?***

Use const: If you are sure that a value isn’t going to be changed when running your code. For example, when you declare a sentence that always remains the same.

pinkon5k

pinkon5k3#

当你在constructor中使用const时,它是编译时常量,并且constructor中给出的所有值都必须是常量,
试着给const构造器一个非常量值来看看区别

fcg9iug3

fcg9iug34#

您可以在本地环境中运行代码片段,但首先需要导入benchmark_harness,您不会发现太大的差异,但它将提高flutter创建部件和const无状态部件的元素时的性能,因为它不会在重建或动画时再次创建元素,这是内存密集型的

void main() {
  const ConstObjectBenchMark(32).report();
  const NormalObjectBenchmark(32).report();
}

abstract class Benchmark extends BenchmarkBase {
  const Benchmark(String name) : super(name);

  @override
  void exercise() {
    for (int i = 0; i < 1000000; i++) {
      run();
    }
  }
}

class ConstObjectBenchMark extends Benchmark {
  const ConstObjectBenchMark(this.length) : super('growable[$length]');

  final int length;

  @override
  void run() {
    const constPerson = ConstPerson('Const Person', 30);
  }
}

class NormalObjectBenchmark extends Benchmark {
  const NormalObjectBenchmark(this.length) : super('fixed-length[$length]');

  final int length;

  @override
  void run() {
    final normalPerson = NormalPerson('Const Person', 30);
  }
}

class ConstPerson {
  final String name;
  final int age;

  const ConstPerson(this.name, this.age);
}

class NormalPerson {
  final String name;
  final int age;

  NormalPerson(this.name, this.age);
}

字符串
产出:


的数据

相关问题