「onPressedの引数として渡すVoidCallbackって何?」
今回はこんな悩みを解消します。
onPressedが使用される例としてElevatedButtonがありますが、ElevatedButtonではボタンが押された時の処理を設定するためにonPressedが使用されます。
一方でonPressedの引数に(){}
のような名前の無い関数が渡されることに「なぜ通常の関数じゃダメなの?」と疑問に思った方も少なく無いと思います。
これらの点を含めてonPressedとは何かについて解説していきます!
VoidCallbackとは戻り値の無い関数のこと
onPressedの解説を進めていく上でまず初めに知っておきたいのが「VoidCallback」についてです。onPressedのドキュメントを見ると引数にVoidCallbackを渡すよう指示があります。
結論から言いますとVoidCallbackはとてもシンプルで「戻り値の無い関数」のことです。よってVoidCallbackが引数に必要と指示されたら次のような戻り値の無い関数clicked()
を渡すことが可能です。
void clicked() {
print('ボタンが押されました');
}
しかしながらonPressedの引数には名前のある関数clicked()
ではなく、名前の無い関数(無名関数)渡すのが基本となります。
それではなぜonPresedの引数に無名関数を渡すのかについて解説していきます。
onPressedの引数に無名関数を渡すのはなぜ?
onPressedの引数に名前のある関数ではなく無名関数を渡す理由についてですが、関数の名前を付けて管理するのが面倒だから無名関数を渡すのだと思われます。
論より証拠ということでそれぞれのコードを比較していきます。
一般の関数をonPressedの引数とした場合
名前のある関数をonPressedの引数として渡す場合は関数に名前をつけて管理する必要があり、次のような簡単な処理を実行したい場合はコードが長くなってしまい面倒です。
逆にボタンが押された際の処理が多くて見栄えが悪くなってしまう場合などには、関数を定義して引数に渡すことも可能です。
void _clicked() {
print('ボタンが押されました');
}
ElevatedButton(
child: Text('押してください'),
onPressed: _clicked,
),
ちなみにですがonPressedの引数に定義した関数を渡す場合は丸括弧()
を省略します。
無名関数をonPressedの引数とした場合
無名関数をonPressedの引数とする場合は直接処理を書けるので管理が楽になります。こちらの書き方が一般的となります。
ElevatedButton(
child: Text('押してください'),
onPressed: () => ('ボタンが押されました'),
),
まとめ
今回はonPressedの引数となる「VoidCallbackとは何か?」「無名関数を渡すのはなぜか?」について解説しました。
結論としてはとてもシンプルでVoidCallbackは戻り値の無い関数のことで、無名関数を渡すのはわざわざ関数を定義するのが面倒だからです。