🦅

FlutterでSingleton(シングルトン)が複数作られてしまった話

2020/10/14に公開

発生した問題

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 が大文字になっているのを発見したというしだいです。
https://qiita.com/kainos/items/da51695f2fc11005167b

アプリ開発に限らず、大文字小文字はハマりどころではありますが、別の言語でアプリ開発をしているときには、パスカルケースで開発をしていたので、地味にハマってしまいました。
(Flutterの時にはちゃんとスネークケースを使っています)

Android Studio でも特に警告は出なかったので、いい知見を知っている人がいたらぜひご教授ください!m(_ _)m

Discussion