节省资源:由于不需要在每次更新时重新构造,使用 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'), )为什么它很重要:误用着色器遮罩可能会导致性能显著下降,特别是在较旧或配置较低的设备上。