Appearance
可复用的组件属性常量
前面的章节,我们提到过const变量在编译器的优化,一个常量同样的值,在内存中只会被存储一个,所以在组件中使用可复用的组件属性常量,不仅便于组件的维护,而且可以减少组件渲染过程中避免过多的jank,从而提升性能。所以,一定要学会声明可复用的组件属性常量。
什么是可复用的组件属性常量?
组件的属性有很多种,比如Padding里的padding, 一个被重复使用的内置组件SizedBox.shrink()
,默认的主题颜色Color配置,borderRadius。他们都是可以被服用的常量,而且有可能同时被多个组件复用。
dart
import 'package:flutter/material.dart';
class MyWidget extends StatelessWidget {
const MyWidget({super.key});
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.all(10),
child: const Center(child: Text("你好"),),
);
}
}
打比方,上面组件中的padding,是一个常量,为了保证UI渲染效果统一,这个padding值,会被不同的组件调用,所以这时候我们就可以将padding属性的值,抽取到一个统一的全局类进行管理,下次给不同的组件进行调用。或者:
dart
const Widget shrinkBox = SizedBox.shrink();
当我们要渲染一个空的组件时,直接使用shrinkBox,就可以避免每次都去创建一个空的组件,在内存中,无论同一个页面中这个组件被调用多少次,占用的内存都是一样的。
Global 类封装
Global类,是一个全局变量的类,里面可以存放复用率较高的全局变量,比如:
dart
class Global {
static const Color primaryColor = Color(0xFF6200EE);
const Widget shrinkBox = SizedBox.shrink();
/// 默认padding
static const double kDefaultPadding = 10;
/// 默认组件内部padding
static const double kDefaultComponentInsetPadding = 10;
/// scaffold padding
static const EdgeInsets kScaffoldPadding =
EdgeInsets.only(left: kDefaultPadding, right: kDefaultPadding);
}
当整个APP组件,或者无限列表不断增加时,他们都可以调用这些常量,这样一来并不会因为每个组件的属性配置差异,导致内存不必要的占用,而且便于后期组件维护。
通过library模式,管理模块
如果你的一个模块较大,你可以使用library *;
来进行代码管理。
dart
/// market.dart
library market;
import 'package:flutter/material.dart';
part 'src/market_consts.dart';
part 'src/market_app.dart';
这样的方式,可以让你的代码更加清晰,便于管理。
dart
/// src/market_consts.dart
part of '../market.dart';
class _MarketConsts {
static const String appName = 'market';
}
而src/market_app.dart
,则仅导出一个组件。
dart
/// src/market_app.dart
part of '../market.dart';
class MarketApp extends StatelessWidget {
const MarketApp({super.key});
@override
Widget build(BuildContext context) {
return const Placeholder();
}
}
你看,这样是不是非常方便的管理了一个内置模块,而且和应用完成解耦。MarketApp只需要继承MaterailApp配置,就可以完成整个应用的渲染。