🧝‍♂️

@Default('')とは?

2023/07/04に公開

🔍Freezedで使ったことないので調べてみた

https://pub.dev/packages/freezed

Default values
Similarly to asserts, Dart does not allow "redirecting factory constructors" to specify default values.

As such, if you want to specify default values for your properties, you will need the @Default annotation:

翻訳
デフォルト値
アサートと同様に、Dart では "ファクトリコンストラクタのリダイレクト" でデフォルト値を指定することはできません。

そのため、プロパティにデフォルト値を指定したい場合は @Default アノテーションが必要となります:

class Example with _$Example {
  const factory Example([(42) int value]) = _Example;
}

わかりやすく説明すると、Freezedで作ったクラスのメンバ変数に、初期値を入れるには、@Default('')をつけないとダメってことですね。

🤖とりあえず動かしてみる

必要なパッケージをREADME通りに追加

dart pub add freezed_annotation
dart pub add --dev build_runner
dart pub add --dev freezed
# if using freezed to generate fromJson/toJson, also add:
dart pub add json_annotation
dart pub add --dev json_serializable

🛠️今回作るファイル

employee.dartにモデルクラスを作成します。employee.freezed.dartとemployee.g.dartは、コマンドを打つと自動生成されます。

lib/
├── employee.dart
├── employee.freezed.dart
├── employee.g.dart
└── main.dart

employee.dartを作成

employee.dart
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter/foundation.dart';

// ファイルと同じ名前を . の前につける
part 'employee.freezed.dart';
part 'employee.g.dart';
// @は、アノテーションを表す
// アノテーションとは、コードにメタデータを付与すること。
// @Default('')は、デフォルト値を指定する

class Employee with _$Employee {
  const factory Employee({
    (0) int id,
    ('') String name,
    ('') String email,
    ('') String position,
  }) = _Employee;

  // factory Employee.fromJsonは、employee.g.dartで自動生成される
  // 役割は、JSONからEmployeeクラスを生成する
  factory Employee.fromJson(Map<String, dynamic> json) =>
      _$EmployeeFromJson(json);
}

初期値を入れるときはこんな感じです

import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter/foundation.dart';

// ファイルと同じ名前を . の前につける
part 'employee.freezed.dart';
part 'employee.g.dart';
// @は、アノテーションを表す
// アノテーションとは、コードにメタデータを付与すること。
// @Default('')は、デフォルト値を指定する

class Employee with _$Employee {
  const factory Employee({
    (0) int id,
    ('hoge') String name,
    ('hoge@gmail') String email,
    ('king') String position,
  }) = _Employee;

  // factory Employee.fromJsonは、employee.g.dartで自動生成される
  // 役割は、JSONからEmployeeクラスを生成する
  factory Employee.fromJson(Map<String, dynamic> json) =>
      _$EmployeeFromJson(json);
}

ファイルを自動生成するコマンド

flutter pub run build_runner build

main.dartの全体のコード

Listを使って複数のダミーデータを入れた変数と、初期値をそのまま使う変数を使用して、UIにダミーデータを表示するロジックです。

main.dart
import 'package:flutter/material.dart';
import 'package:freezed_app/employee.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const EmployeeList(),
    );
  }
}

class EmployeeList extends StatelessWidget {
  const EmployeeList({super.key});

  
  Widget build(BuildContext context) {
    final hoge = Employee();
    final employees = <Employee>[
      Employee(
        id: 1,
        name: 'John Doe',
        email: 'john.doe@example.com',
        position: 'Software Developer',
      ),
      Employee(
        id: 2,
        name: 'Jane Smith',
        email: 'jane.smith@example.com',
        position: 'Project Manager',
      ),
      // 他の従業員データ...
    ];

    return Scaffold(
      appBar: AppBar(
        title: Text('${hoge.name} - ${hoge.email} - ${hoge.position} - ${hoge.id}'),
      ),
      body: ListView.builder(
        itemCount: employees.length,
        itemBuilder: (context, index) {
          final employee = employees[index];
          return ListTile(
            title: Row(
              children: [
                Text(employee.name),
                const SizedBox(width: 8),
                Text(employee.email),
              ],
            ),
            subtitle: Row(
              children: [
                Text(employee.position),
                const SizedBox(width: 8),
                Text(employee.id.toString()),
              ],
            ),
          );
        },
      ),
    );
  }
}

まとめ

@Default('')は、最初見た時は、パニクってましたが、理解ができると普通のクラスと変わらなかったですね。

Flutter大学

Discussion