2つのモデルを1つのモデルに統合する方法

ゴール

TodoモデルとTodoDetailモデルを1つに統合した
UnityTodoモデルを作成したい

Todoモデル

@freezed
class Todo with _$Todo {
  const factory Todo({
    required int id,
    required String title,
  }) = _Todo;

  factory Todo.fromJson(Map<String, dynamic> json) => _$TodoFromJson(json);
}

TodoDetailモデル

@freezed
class TodoDetail with _$TodoDetail {
  const factory TodoDetail({
    required String fileName,
  }) = _TodoDetail;

  factory TodoDetail.fromJson(Map<String, dynamic> json) =>
      _$TodoDetailFromJson(json);
}

UnityTodoモデル(統合モデル)

import 'package:freezed_annotation/freezed_annotation.dart';

part 'unity_todo.freezed.dart';

@freezed
class UnityTodo with _$UnityTodo {
  const factory UnityTodo({
    required int id,
    required String title,
    required String fileName,
  }) = _UnityTodo;

  factory UnityTodo.fromModel({ //👈ここ
    required Todo todo,
    required TodoDetail todoDetail,
  }) {
    return UnityTodo(
      id: todo.id,
      title: todo.title,
      fileName: todoDetail.fileName,
    );
  }
}

Factoryコンストラクタで、
2つのモデル(Todo・TodoDetail)を引数として受け取り、
1つのモデルに統合したインスタンス(UnityTodo)をreturnする

使い方

class HomeScreenNotifier extends StateNotifier<HomeScreenState> {
  HomeScreenNotifier() : super(const HomeScreenState());

  void method() {
    for (final todo in todos) {
      final unityTodo = UnityTodo.fromModel(
        todo: todo,
        todoDetail: todoDetail,
      );
      logger.i('unityTodo: $unityTodo');
    }
  }
}

この記事が気に入ったらサポートをしてみませんか?