💭

【Flutter】メソッドを別ファイルに切り出した際、「method not found」が出た

2021/11/22に公開

概要

  • Flutterで、メソッドを別ファイルに切り出して、インポートしてクラス名.メソッド名で使おうとしたらmethod not found
  • インスタンスを作らずに呼び出そうとしていたのが原因
    • 型 メソッド名()で宣言した場合インスタンスメソッドになることを知らなかった
    • staticを付けて宣言すればクラスメソッドとなり、クラス名.メソッド名で呼び出せる

本題

やりたかったこと

main.dartにAPIを叩く処理を入れていたので別ファイルに切り出したくなった。

ファイル分割前

該当メソッド(State内部で定義)

main.dart
Future<void> _localAPITest() async {
    final url = Uri.parse('http://192.168.0.4:30000/api/v1/users');
    final response = await http.get(url);
    print('Response status: ${response.statusCode}');
    print('Response body: ${response.body}');
  }

呼び出し箇所(State内部のWidget build内のreturnの中)

main.dart
ElevatedButton(
    onPressed: _localAPITest,
    child: const Text('ローカルAPIテスト'),
),

ファイル分割後(動かなかったコード)

該当メソッド(/lib/service/api.dart)

service/api.dart
import 'dart:io';
import 'package:http/http.dart' as http;

class ApiService {
  Future<void> localAPITest() async {
    final url = Uri.parse('http://192.168.0.4:30000/api/v1/users');
    final response = await http.get(url);
    print('Response status: ${response.statusCode}');
    print('Response body: ${response.body}');
  }
}

呼び出し箇所(method not foundが出ました)

import 'package:アプリ名/service/api.dart';は追加しています

main.dart
ElevatedButton(
    onPressed: ApiService.localAPITest,
    child: const Text('ローカルAPIテスト'),
),
  • 他に試した呼び出し方(全てmethod not found)
    • localAPITest
    • localAPITest()
    • importにas apiをつけて、api.localAPITest

起きていたこと

  • ApiServiceクラス内でFuture<void> localAPITest() async {}で宣言したメソッドはインスタンスメソッドのためインスタンス化していないと使えなかった
  • static Future<void> localAPITest() async {}という風に、staticをつけて宣言すればクラスメソッドになるため、ApiService.localAPITestで呼び出すことができた

修正後

main.dart
class _MyHomePageState extends State<MyHomePage> {
ApiService api = ApiService(); // ApiServiceクラスのインスタンス作成
(中略)

  Widget build(BuildContext context) {
      (中略)
ElevatedButton(
    onPressed: api.localAPITest,
    child: const Text('ローカルAPIテスト'),
),

記事を書いた動機

Flutterが初めてとはいえど、とても初歩的なことで1時間位悩んで悔しかったので再度同じミスをしないように記録に残しておきたかった

参考文献

https://www.cresc.co.jp/tech/java/Google_Dart2/language/classes/classes.html#__RefHeading__65434_499877414

Discussion