flutter - 使用 getter 模式而不是典型的不可变成员会带来什么影响?

标签 flutter dart

考虑到这两种简单的静态值设计模式,它们各自的含义是什么?在访问其成员时,Dart/Flutter 应用程序的性能和内存使用情况是否相同?

示例 A:MyStringsGetters

const strings = MyStringsGetters();

class MyStringsGetters {
  const MyStringsGetters();
  get helloWorld => 'Hello, World';
}

示例 B:MyStringsMembers

const strings = MyStringsMembers();

class MyStringsMembers {
  const MyStringsMembers();
  static const helloWorld = 'Hello, World';
}

最佳答案

示例 A 效率会更低。 Getter 本质上是在运行时调用的方法,并且它们的响应不会被缓存。是的,类实例是 const并且只会在内存中存储一​​次,但 getter 本质上会在每次调用它时创建一个新的内存地址。

我建议使用示例 B

这是我的证明。我构建了一个虚拟应用程序,它使用您共享的两个示例来呈现 100 个显示 Hello World 字符串的文本实例,结果如下:

<表类=“s-表”> <标题> 示例 A 示例 B <正文> enter image description here enter image description here

你可以清楚地看到Example B中分配的内存要小得多。主要原因是getter会分配新的内存地址。

您还可以使用内存开发工具来解决此类问题。这是我使用的代码:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

const strings = MyStringsMembers();

class MyStringsMembers {
  const MyStringsMembers();
  static const helloWorld = 'Hello, World';
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: MyStringsMembers.helloWorld,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<Widget> _widgets() {
    List<Widget> result = [];
    for (var i = 0; i < 10000; i++) {
      result.add(Text(MyStringsMembers.helloWorld));
    }
    return result;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
        child: Column(
            mainAxisAlignment: MainAxisAlignment.center, children: _widgets()),
      ),
    );
  }
}

如果您对有关如何提高 Flutter 应用程序性能的更多技巧感兴趣,我写了一篇文章 here .

这是否记录在某处?

我尝试查看文档,但找不到太多相关信息。我在Dart Programming Language Specification中找到的最接近的信息本书第 37 页。

Getters are functions (9) that are used to retrieve the values of object properties.

鉴于您没有将字符串的值存储为对象属性,并且 getter 本质上只是一个执行您指定操作的辅助函数,因此每次调用时它最终都会分配内存。 "Hello world"本质上是说用这个内容在内存中创建一个新字符串。

关于flutter - 使用 getter 模式而不是典型的不可变成员会带来什么影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68485208/

相关文章:

android - 开发Native Plugin时 `GeneratedPluginRegistrant.class`的用途和用法

firebase - 添加三元或 if 运算符来检测 Flutter StreamBuilder 中输出文本中的条件?

flutter - 从无状态小部件调用到有状态小部件时,变量返回null吗?

dart - 为什么 cupertino_icons 中的图标很少?

json - 无法从 flutter 中的 jsonDecoded 变量中提取 key

firebase - 在 Flutter Firebase 应用程序中存储 API key ?我需要隐藏它们吗?如何?

android - 什么是 Android 调试符号以及如何在 Flutter 应用程序中配置它

dart - 支持&lt;input type ='datetime'>

java - Flutter Java android从/app_flutter文件夹中的文件获取数据

flutter - Flutter:如何返回数据?