Flutter 雑学「late」 後で必ず入れるから待ってて!

変数を宣言するとき、最初は値がないけど、後で必ず入れるというときに使います。

class UserProfile {
  String name;  // ❌ エラー! 初期値がない!
  
  UserProfile() {
    // 後でAPIから取得する予定...
  }
}

Dartは「初期値がないとダメ!」と怒ります

解決策1: null許容にする(でも面倒…)

class UserProfile {
  String? name;  // null かもしれない
  
  void showName() {
    print(name ?? '名前なし');  // いつも ?? でチェック必要
  }
}

解決策2: late を使う!

class UserProfile {
  late String name;  // 「後で必ず入れます!」という約束
  
  UserProfile() {
    // 最初は空でOK
  }
  
  void loadFromAPI() async {
    name = await fetchUserName();  // 後で代入
  }
  
  void showName() {
    print(name);  // null チェック不要!
  }
}

Flutter でよく見る使い方

class MyPage extends StatefulWidget {
  @override
  _MyPageState createState() => _MyPageState();
}

class _MyPageState extends State<MyPage> {
  late TextEditingController controller;  // 後で initState で作る
  
  @override
  void initState() {
    super.initState();
    controller = TextEditingController();  // ここで初期化
  }
  
  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }
  
  @override
  Widget build(BuildContext context) {
    return TextField(controller: controller);
  }
}

まとめ

late は「今はないけど、使う前には必ず入れる」という約束

⚠️ 注意点: ただし使う前に値を入れないとエラー!

late String message;

void showMessage() {
  print(message);  // ❌ 実行時エラー! まだ値が入ってない!
}

// 正しい使い方
late String message;

void setMessage() {
  message = 'こんにちは';  // 先に値を入れる
}

void showMessage() {
  print(message);  // ✅ OK!
}