Flutter:将小部件存储在变量中的效率如何?

问题描述

我上过这堂课(下面是逻辑课)

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变量定义为“最终列表= []”。也尝试一下。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...