Flutter - падение производительности (jank) из-за слишком большого количества дочерних элементов Stack

Я должен визуализировать дерево с неизвестным количеством листьев. Но когда количество листьев слишком велико, производительность приложения резко падает. Что я могу сделать, чтобы повысить производительность? Количество листьев может достигать 1000, поэтому стек из 1000 дочерних элементов может снизить производительность, но что я могу с этим поделать? Заранее спасибо!

      class Tree extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final Random random = new Random();
    final leaf = Provider.of<Leafs>(context, listen: false);
    final heightTree = (MediaQuery.of(context).size.width - 60) * (772 / 480); //Ratio of the tree
    final heightTreeTrunk = heightTree * (169 / 772); //Ratio of the treetrunk
    const leafSize = 20.0;
    final children = <Widget>[
      Padding(
        padding: EdgeInsets.fromLTRB(30, 15, 30, 0),
        child: Image.asset(
          'assets/images/tree2.png',
          color: Colors.grey.shade600,
        ),
      ),
    ];
    for (var i = 0; i < leaf.tot; i++) {
      double angle = random.nextInt(100) / 100 * 2 * pi;
      double ran = sqrt(random.nextInt(100) / 100);
      children.add(
        Padding(
          padding: EdgeInsets.fromLTRB(5, 0, 5, heightTreeTrunk),
          child: Align(
            alignment: Alignment(
              ran * cos(angle),
              ran * sin(angle),
            ),
            child: RotationTransition(
              turns: AlwaysStoppedAnimation(random.nextInt(360) / 360),
              child: SizedBox(
                height: leafSize,
                width: leafSize,
                child: Image.asset(
                  'assets/images/leaf8.png',
                ),
              ),
            ),
          ),
        ),
      );
    }
    return Container(
      height: heightTree,
      child: Stack(children: children,),
    );
  }
}

1 ответ

Вероятно, вы могли бы попробовать заменить свой RotationTransition виджетом Transform.rotate, поскольку вы используете AlwaysStoppedAnimation.

И вы также можете использовать виджет с позиционированием вместо виджета Alignment + Padding!

Другие вопросы по тегам