考虑到这两种简单的静态值设计模式,它们各自的含义是什么?在访问其成员时,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 字符串的文本实例,结果如下:
你可以清楚地看到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/