闽公网安备 35020302035485号
节省资源:由于不需要在每次更新时重新构造,使用 const 可以减少内存使用和 CPU 负担。
代码清晰:标记为 const 的 Widgets 明确表示它们的状态在整个生命周期内不会改变,有助于提高代码的可读性和可维护性。
树的稳定性:使用 const 可以使 Widget 树在构建时更稳定,Flutter 能更有效地管理 Widget 树,减少对 UI 更新的影响。
const Text('Hello, World!');
不使用 const 的形式:Text('Hello, World!');
Flutter 中的小部件是无状态且不可变的。实际上,当你使用“const”关键字时,你就是在告诉 Flutter 该小部件的属性不会随着时间改变。这有助于 Flutter 在重建应用程序的过程中渲染相同的部件而不是创建新的部件,从而使其更快。const Text('Hello World') // Using const constructor
为什么它很重要:通过使用“const”小部件,由于 Flutter 能够更好地管理小部件树,因此重建时占用的内存更少,耗时更短。class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: [
Text('This part will be redrawn normally'),
RepaintBoundary(
child: Container(
color: Colors.blue,
width: 100,
height: 100,
child: Center(child: Text('Optimized')),
),
),
Text('This part will also be redrawn normally'),
],
);
}
}
使用 GlobalKey:可以通过 GlobalKey 获取 RepaintBoundary 的绘制信息,如图像。final GlobalKey _key = GlobalKey();
// 堆代码 duidaima.com
void _capturePng() async {
RenderRepaintBoundary boundary = _key.currentContext.findRenderObject();
var image = await boundary.toImage();
// 处理图像
}
特点Opacity(opacity: 0.0, child: MyWidget())使用:
Visibility(visible: false, child: MyWidget())或者有条件地:
if (isVisible) MyWidget()为什么它很重要:这个 hack 防止了框架不必要的继续渲染隐藏的小部件。
ListView.builder(
itemCount: 1000,
itemBuilder: (context, index) {
return ListTile(title: Text('Item $index'));
},
)
为什么它很重要:这避免了内存过载,并通过按需懒加载项目来确保滚动顺畅。Future<void> loadData() async {
var data = await fetchDataFromAPI();
setState(() {
_data = data;
});
}
为什么它重要:这确保了在后台处理繁重任务时,您的用户界面保持响应状态。CachedNetworkImage( imageUrl: "https://example.com/image.png", placeholder: (context, url) => CircularProgressIndicator(), errorWidget: (context, url, error) => Icon(Icons.error), )为什么这很重要:通过缓存图像,您的应用减少了网络请求和内存使用,从而实现更快的图像渲染和更流畅的滚动。
Widget build(BuildContext context) {
return Column(
children: [
buildHeader(),
buildBody(),
buildFooter(),
],
);
}
分解它:class Header extends StatelessWidget { ... }
class Body extends StatelessWidget { ... }
class Footer extends StatelessWidget { ... }
为什么这很重要:这种模块化方法确保了仅重建受影响的部件,减少了不必要的计算。flutter pub global activate devtools flutter run --track-widget-creation当开启这个选项时,Flutter 会在构建 Widget 时记录创建这些 Widget 的源代码位置。这使得在调试时能够更容易地识别和定位 Widget 的定义位置。使用 Dart DevTools 界面分析你的应用。
ShaderMask(
shaderCallback: (Rect bounds) {
return RadialGradient(
center: Alignment.topLeft,
radius: 1.0,
colors: <Color>[Colors.yellow, Colors.deepOrange.shade900],
tileMode: TileMode.mirror,
).createShader(bounds);
},
child: Text('Shader Masked Text'),
)
为什么它很重要:误用着色器遮罩可能会导致性能显著下降,特别是在较旧或配置较低的设备上。