颤振模态底片性能问题

时间:2020-02-24 19:29:23

标签: performance flutter bottom-sheet

当拖动模态底部工作表时,如果很多小部件位于工作表内部,则flutter应用程序将开始滞后。这仅发生在模式底板(showModalBottomSheet)上,而不发生在普通底板(showBottomSheet)上。 下面我附上了性能分析的屏幕截图,该屏幕截图显示了在用户拖动时工作表中的所有小部件都在不断重建。

我写了一个小样片来比较两种纸的性能。有什么方法可以防止拖动时重建?

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

/// This Widget is the main application widget.
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "demo",
      home: Scaffold(
        body: MyButtons(),
      ),
    );
  }
}

class MyButtons extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          RaisedButton(
            onPressed: () {
              showModalBottomSheet<void>(
                context: context,
                builder: (context) => BottomSheet(),
              );
            },
            child: Text("show modal (laggy)"),
          ),
          RaisedButton(
            onPressed: () {
              showBottomSheet<void>(
                context: context,
                builder: (context) => BottomSheet(),
              );
            },
            child: Text("show normal (not laggy)"),
          ),
        ],
      ),
    );
  }
}

class BottomSheet extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Wrap(
      spacing: 8.0,
      alignment: WrapAlignment.center,
      children: List<Widget>.generate(
        100,
        (int index) {
          return InputChip(
            label: Text("test"),
          );
        },
      ),
    );
  }
}

2 个答案:

答案 0 :(得分:3)

我创建了this PR来解决此性能问题。问题是AnimatedContainer中的ModalBottomSheet没有使用child属性,因此在动画运行时它被迫多次调用builder方法,而不是使用已经建立的子小部件。

答案 1 :(得分:1)

只需将flutter更新到最新版本。对Enol Casielles Martinez表示敬意