世界最大級のオンライン学習サービス「Udemy」のセール状況はこちら

【Flutter】onPressedの関数の丸括弧が省略されるのはなぜ?

onPressedの引数として渡す関数の丸括弧が省略されるのはなぜ?

今回はこんな悩みを解消します。

ElevatedButtonなどonPressedの引数に無名関数ではなく定義した関数を渡す場合、関数の丸括弧をつけたまま渡すとエラーが生じます。

一体なぜonPressedの引数に関数を渡す場合は丸括弧を省略されるのかについて解説していきます!

目次

VoidCallbackを渡してるのにエラーが生じるのはなぜ?

onPressedの引数にVoidCallbackを渡すよう指示され戻り値の無い関数_clicked()を渡してもエラー「Error: This expression has type ‘void’ and can’t be used.」が生じてしまいます。

void _clicked() {
  print('ボタンが押されました');
}

ElevatedButton(
  child: Text('押してください'),
  onPressed: _clicked(),
),

一方で関数の丸括弧を省略_clickedして渡すと正常に動作します。

void _clicked() {
  print('ボタンが押されました');
}

ElevatedButton(
  child: Text('押してください'),
  onPressed: _clicked,
),

これらの理由についてですが_clicked()を渡した場合はElevatedButtonが描画された時に関数が呼び出されエラーが生じてしまうのに対し、_clickedではボタンが押されたのを確認してから処理が実行されるので正常に動作します。

まとめ

今回はonPressedの引数に関数を渡す際になぜ丸括弧を省略するのかについて解説しました。

一般的にonPressedの引数には無名関数を渡しますが、処理が長い場合などには関数を定義しても便利です。

目次