15
7

More than 1 year has passed since last update.

Flutter SingleChildScrollViewの中でListView.builderを使おうとしたらパフォーマンス悪いと知った話

Last updated at Posted at 2023-07-28

はじめに

先日、こういった有力な情報を偶然目にした

え、今まさにこんな実装をやっていた。。。」と思い、完全にシバき倒されることとなった。

    return SingleChildScrollView(
      child: Column(
        children: [
          Image.asset('images/sample.jpg'),
          GridView.builder(
            shrinkWrap: true,
            physics: const NeverScrollableScrollPhysics(),
            gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: 2,
              childAspectRatio: 0.53,
            ),
            itemCount: jobItems.length,
            itemBuilder: (context, index) {
              final jobItem = jobItems[index];
              return JobItem(jobItem: jobItem);
            },
          ),
        ],
      ),
    );

イメージとしては👇のような画面を実装しようとしていました。

Screenshot 2023-07-29 at 13.36.19.png

なぜパフォーマンス悪いのか?

どうやらこういった理由らしいです。。

shrinkWrap: trueにすることでこの「見えている範囲」が「指定された個数分の範囲(スクショの例だと100個分)」になってしまうため、実際に見えていないWidget分もメモリが確保されてしまいます

同じような声が別の人からもありました。

何も考えずにshrinkWrap: trueを使うのはどうやら避けたほうがいいようですね。

CustomScrollViewで実装してみた

    return CustomScrollView(
      slivers: [
        Image.asset('images/sample.jpg'),
        SliverGrid(
          delegate: SliverChildBuilderDelegate(
            (context, index) {
              final jobItem = jobItems[index];
              return JobItem(jobItem: jobItem);
            },
            childCount: jobItems.length,
          ),
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 2,
            childAspectRatio: 0.53,
          ),
        ),
      ],
    );

CustomScrollViewを使ってその中にSliverGridを使うことでGridView.builderと同じ実装を実現することができました!!!

15
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
7