INDEX / JOURNAL / LOG-013
VOL. 2026 · ENGINEERING
SERIES 6 / 8
LOG-013 · FREEZED

Freezed が書いてくれるもの

PUBLISHED
2026 · 09 · 04
AUTHOR
MIGIWAYA
READ
約 5 分
TAGS
#flutter#dart

§ 01PROBLEM

lib/models/user.dartDART
class User {
const User({required this.id, required this.name, this.age});
 
final String id;
final String name;
final int? age;
 
User copyWith({String? id, String? name, int? age}) =>
User(id: id ?? this.id, name: name ?? this.name, age: age ?? this.age);
 
@override
bool operator ==(Object other) =>
other is User && other.id == id && other.name == name && other.age == age;
 
@override
int get hashCode => Object.hash(id, name, age);
 
@override
String toString() => 'User(id: $id, name: $name, age: $age)';
}

§ 02VALUE

DART
const a = User(id: '1', name: 'みぎわ');
const b = User(id: '1', name: 'みぎわ');
// == を書いていなければ a == b は false

§ 03FREEZED

lib/models/user.dartDART
import 'package:freezed_annotation/freezed_annotation.dart';
 
part 'user.freezed.dart';
 
@freezed
abstract class User with _$User {
const factory User({
required String id,
required String name,
int? age,
}) = _User;
}
▸ TERMINALTERMINAL
dart run build_runner build --delete-conflicting-outputs

§ 04COPYWITH

DART
final updated = user.copyWith(name: '新しい名前');

§ 05UNION

lib/models/result.dartDART
@freezed
sealed class LoadResult with _$LoadResult {
const factory LoadResult.loading() = Loading;
const factory LoadResult.data(List<User> users) = Data;
const factory LoadResult.failure(String message) = Failure;
}
DART
final label = switch (result) {
Loading() => '読み込み中',
Data(:final users) => '${users.length} 件',
Failure(:final message) => 'エラー: $message',
};

§ 06JSON

lib/models/user.dartDART
part 'user.freezed.dart';
part 'user.g.dart';
 
@freezed
abstract class User with _$User {
const factory User({
required String id,
@JsonKey(name: 'display_name') required String name,
@Default(0) int age,
DateTime? createdAt,
}) = _User;
 
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
}

§ 07BUILDRUNNER

▸ TERMINALTERMINAL
dart run build_runner watch --delete-conflicting-outputs

§ 08SUMMARY

脚注 · NOTES
  1. [1]
  2. [2]
同シリーズ · Flutter の基礎を実コードで学ぶ II
§ + RELATED すべて見る →
INQUIRY
CONTACT
LOCATION
STATUS
Active / Open
ESTABLISHED
2024 · 5 · 5
FORM