変数を宣言するとき、最初は値がないけど、後で必ず入れるというときに使います。
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!
}
