问题描述
我上过这堂课(下面是逻辑课)
class Page extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: CustomScrollView(
physics: BouncingScrollPhysics(),slivers: [
SliverPersistentHeader(
delegate: HeaderWithHorizontalList(),pinned: true,),SliverList(
delegate: SliverChildBuilderDelegate((context,index) {
if (index > 30) return null;
return Container(
color: ColorHelper.primary.withOpacity(index / 30),height: SizeHelper.width(40),);
}),],);
}
}
并且上面的课程正在使用此无状态小部件
旧代码
class HeaderWithHorizontalList extends SliverPersistentHeaderDelegate {
@override
double get maxExtent => 284;
@override
double get minExtent => 106;
@override
Widget build(
BuildContext context,double shrinkOffset,bool overlapsContent,) {
double visiblePixels = max(minExtent,maxExtent - shrinkOffset);
double travelledPixels = maxExtent - visiblePixels;
double percentage = travelledPixels / (maxExtent - minExtent);
return Material(
color: Colors.white,elevation: percentage * 8,child: Stack(
alignment: Alignment.bottomCenter,overflow: Overflow.clip,children: AppHorizontalScroll(
verticalPadding: 19,horizontalPadding: 22,betweenPadding: 13,items: [
MyCustomWidget(
type: MyCustomWidgetType.1,isActive: false,MyCustomWidget(
type: MyCustomWidgetType.2,MyCustomWidget(
type: MyCustomWidgetType.3,MyCustomWidget(
type: MyCustomWidgetType.4,);
}
@override
bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) {
return false;
}
}
新代码
class HeaderWithHorizontalList extends SliverPersistentHeaderDelegate {
List<PreferredSizeWidget> list = [
MyCustomWidget(
type: MyCustomWidgetType.1,MyCustomWidget(
type: MyCustomWidgetType.2,MyCustomWidget(
type: MyCustomWidgetType.3,MyCustomWidget(
type: MyCustomWidgetType.4,];
@override
double get maxExtent => 284;
@override
double get minExtent => 106;
@override
Widget build(
BuildContext context,items: list,);
}
@override
bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) {
return false;
}
}
所以,这是问题。
在旧版本中,当我将打印内容放入MyCustomWidget的build方法中时,由于滚动而每次调整持久标头的大小时,它都会打印一次。
因此,为了防止将MyCustomWidget的列表放在变量中,现在仅一次调用它的build方法。
该解决方案是否有效?或者这是一种好习惯?
解决方法
这非常简单:调用构建方法的次数越少-越好。
因此,如果您的新代码能够按您的方式工作,并减少了build()的执行,并且在需要时不难扩展-您就很好了。
至于Widget列表-也可以像这样使用它们(因为您不再更改它,您甚至可以将其设置为“最终”变量)就很好了。
您可以使用以下链接了解有关Flutter性能优化的更多信息:Performance Best Practices
还有一点题外话:如果您想使代码更整洁,请尝试在项目中使用linter。我个人使用Pedantic by Dart Team。
例如:建议将List变量定义为“最终列表=