ProviderとConsumerについて
ツリーが深くなると、祖先のWidgetへのアクセス効率が悪くなったり、再構築の処理速度は遅くなります。そんな際に用いられるのが、Providerパッケージ。上位にProviderを挟むことで簡単に下位WidgetからProviderへのアクセスを可能にします。
このProviderパッケージ使用時に下位Widgetとして用いられるのが、ConsumerでありInheritedWidgetから継承した自作Widgetより記述量を抑えるメリットがあります。これらの役割は、Providerの値変更時のWidgetの再構築範囲をConsumer内に限定することです。
Consumerの引数について
そんなConsumerですが、buider内第三引数に_を用いて記述されることが多いです。
Provider.value<int>(
value: _counter,
child: const Center(
child: Consumer<int>(
builder: (context, value, _) => Text("値は$value")
)
)
)
第一及び第二引数のcontextやvalueは、それぞれ親Elementへの参照やProviderのValueを示していますが、第三引数は何を意味するのでしょう?
さて第三引数の役割ですが、Providerの値を必要としない部分を明示することにあります。
Provider.value<int>(
value: _counter,
child: const Center(
child: Consumer<int>(
builder: (context, value, child) => Text(
"値は$value"
),
child: Text("Providerと関係ないよ")
)
)
)
上記の場合、Providerと関係ないよの部分は、再構築する必要がないと明示していることになります。
そして、本題ですが_を用いた場合についてはどうでしょう。
Provider.value<int>(
value: _counter,
child: const Center(
child: Consumer<int>(
builder: (context, value, _) => Text("値は$value")
)
)
)
TextWidgetの内容は丸々書き換えられるわけですのでConsumer内で再構築しない部分はなさそうです。つまり、書き換えないWidgetはないよというのを明示する意味で今回の_を用いていることとなります。