Flutterで非スクロールなWidgetに対してRefreshIndicatorを機能させる方法
はじめに
Flutterでアプリを作っていて、リソースを更新する際にRefreshIndicator
はよく使われるWidgetであると思う。しかし、これのPullToRefreshを機能させるためには、子要素がスクロール可能なものである必要がある。
しかし、そこで表示させるリストが空のときは、例えばEmptyStateのようなリストではない要素を表示をしたい場合がある。そういう場合には、SingleChildScrollView
にphysics: AlwaysScrollableScrollPhysics()
を適用させる回避策がよく使われるが、そうすると子要素を画面中央に表示させるのが難しくなってしまう。
今回はそういった非スクロールなWidgetを画面の中央に表示させたいが、さらにRefreshIndicator
も機能させたいときの対処法を紹介する。
方法
CustomScrollView
とSliverFillRemaining
を使うことで実現することができる。
RefreshIndicator(
onRefresh: () {},
child: const CustomScrollView(
slivers: [
SliverFillRemaining(
child: Center(
child: TargetWidget(),
),
),
],
),
);
CustomScrollView
でスクロール可能なWidgetを用意し、その中でSliverFillRemaining
を使うことで画面の利用可能なスペースいっぱいにWidgetを広げることができる。これで対象のWidgetを画面の中央に配置しながら、RefreshIndicator
も機能させることができる。
おわり
CustomScrollView
は今回初めて使ったし、Sliver
は知っていたがそこで使う種類がこんなにたくさんあるとは知らなかった。
FlutterはWidgetがたくさんありすぎるが、知っておかないと解決できないことが多々ある。しかし全てのWidgetを覚えようとも思わないし、覚えられるとも思えない。こういうことがあるたびに少しずつ覚えていこう。