💭
【Flutter】メソッドを別ファイルに切り出した際、「method not found」が出た
概要
- 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時間位悩んで悔しかったので再度同じミスをしないように記録に残しておきたかった
参考文献
Discussion