1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Consumer第三引数で使われる _ って何?

Posted at

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はないよというのを明示する意味で今回の_を用いていることとなります。

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?