🦅
FlutterでSingleton(シングルトン)が複数作られてしまった話
発生した問題
Flutterで以下のようなシングルトンのクラスを作って、複数のファイルで呼び出そうとしたら、user
インスタンスがなぜか2つ作られてしまいました。
(printの中身が2回呼び出された)
class User {
static User _userInstance;
final String uid;
factory User(String uid) {
if (_userInstance == null) {
print("userインスタンスを生成します");
_userInstance = new User._internal(uid);
}
return _userInstance;
}
User._internal(this.uid);
}
環境
- macOS Catalina 10.15.1
- Android Studio 3.6.1
- Flutter 1.17.0
結論
2個目の user
インスタンスが生成されている場所の import
するときのファイル名が大文字になっていました。これを user.dart
に修正することで解決しました。
// 本来はこっちが正しい
import "package:sample/user.dart";
// 何故か大文字になっている
import "package:sample/User.dart";
補足
packageの呼び出しの問題かなと思い、 import
している箇所を見てみましたが、 packeage:...
の書き方で統一していたので特に分からずでした。
その時にこちらの記事を見つけて、やはり import
にtypoがあるのではないかとあたりをつけたら、 User.dart
が大文字になっているのを発見したというしだいです。
アプリ開発に限らず、大文字小文字はハマりどころではありますが、別の言語でアプリ開発をしているときには、パスカルケースで開発をしていたので、地味にハマってしまいました。
(Flutterの時にはちゃんとスネークケースを使っています)
Android Studio でも特に警告は出なかったので、いい知見を知っている人がいたらぜひご教授ください!m(_ _)m
Discussion