Flutterでgraphql_codegenとfreezedを併用するとfreezedの型定義が正常に生成されない問題

解決法

ルートディレクトリのbuild.yaml (なければ作成)に、以下を追加する。

これにより、セパレータを任意の文字列に変更できる。

targets:
  $default:
    builders:
      graphql_codegen:
        options:
          namingSeparator: "__"

問題詳細と原因

例えば、graphql_codegenでFetchFugaという名称でfugaに一覧を格納したデータを取得するクエリを定義し、flutter buildすると、デフォルト設定だと Query$FetchFuga$fuga といった型が生成される。

# fuga.graphql
query FetchFuga {
  fuga {
    data
  }
}

これをfreezedで使用する場合、

@freezed
class HogeState with _$HogeState {
  const factory HogeState({
    Query$FetchFuga$fuga? fuga,
  }) = _HogeState;
}

いった形になるが、これをflutter buildで生成すると、型名称内の$をfreezedが正常に解釈できず、fuga という型名称として定義してしまう (最後の$以降が型名称と解釈される)。

本来の型名はQuery$FetchFuga$fugaなのに、freezedはfuga として定義してしまうため、アプリ内部で型不一致が発生する。

これは公式のIssue(https://github.com/heftapp/graphql_codegen/issues/82)でも議論されており、最後の方に解決法も記載されている。
具体的には、以下の機能を活用する。
https://github.com/heftapp/graphql_codegen/tree/main/packages/graphql_codegen#change-naming-separator