【Flutter】This expression has type 'void' and can't be used.

onPressedなどのプロパティで指示されたvoid型の関数を引数に渡したのにも関わらず「This expression has type 'void' and can't be used.」とエラーが出た場合の対処法を紹介します。

今回はElevatedButtononPressedに定義した関数を渡す方法を2つ紹介していきます。

\ 世界最大級のオンライン学習サービス /

目次

エラーが出るコード

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  void _hello() {
    print('Hello World');
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('FlutterZero')),
        body: Center(
          child: ElevatedButton(
            child: Text('Click Me'),
            onPressed: _hello(),
          ),
        ),
      ),
    );
  }
}

//結果
//Error: This expression has type 'void' and can't be used.

ElevatedButtononPressedではvoid Function()を渡すよう指示されているので上記コードで問題なさそうに思えますが、ビルドするとエラーが発生してしまいます。

解決策1|関数の丸括弧を外す(関数名のみ渡す)

ElevatedButton(
  child: Text('Click Me'),
  onPressed: _hello,
),

onPressedの引数に関数を直接渡す場合は関数名の後の丸括弧()を外します。

関数の丸括弧がついたまま関数を渡してしまうとボタンが押される前に処理が実行されてしまいます。丸括弧を外すことでボタンが押された時にのみ処理を実行できます(コールバック関数)。

解決策2|無名関数で処理を書く

ElevatedButton(
  child: Text('Click Me'),
  onPressed: () {
    _hello();
  },
),

onPressedの引数に無名関数(anonymous function)を渡し処理を書くことができます。

無名関数で定めた処理はボタンがタップされた時にのみ実行されます。

サンプルコード

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  void _hello() {
    print('Hello World');
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('FlutterZero')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                child: Text('Click Me'),
                onPressed: _hello,
              ),
              ElevatedButton(
                child: Text('Click Me'),
                onPressed: () {
                  _hello();
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

一緒に読みたい

参考

  • URLをコピーしました!
目次