Freezedの使い方
freezed の準備
・詳しくは他サイト参照。
・パッケージのバージョンは各自で対応すること。
パッケージをインストールする
flutter pub add
freezed_annotation: ^2.2.0
json_annotation: ^4.8.0
pubspec.yamlへ使用するパッケージを追記する
dev_dependecies:以下へ追記する
build_runner: ^2.3.3
freezed: ^2.3.2
json_serializable: ^6.6.1
・freezedのコードを書く時、part以下の部分を記述する。
最初にエラーが出ているが、下記コマンド実行後に解消される。
part 'cardnameitem.freezed.dart'; // for freezed
part 'cardnameitem.g.dart'; // for json
・freezedのコードが書けたら、ターミナルで以下コマンドを実行する
flutter pub run build_runner build
freezedを使用した一例
・freezedでJSONを使用するにはfromJsonメソッドが必要。
・freezed3.0.0より、abstractがクラスの先頭に必要になりました。
import 'dart:convert';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'cardnameitem.freezed.dart'; // for freezed
part 'cardnameitem.g.dart'; // for json
// csv data を読み込むときに使用する
// 追記 abstract ,freezed 3.0.0より必須に
@freezed
abstract class cardNameItem with _$cardNameItem{
const factory cardNameItem({
required String cardName,
required int useDateIndex,
required int payeeIndex,
required int moneyIndex,
}) = _cardNameItem;
factory cardNameItem.fromJson(Map<String , dynamic> json) =>
_$cardNameItemFromJson(json);
}
・下に続く
上記のfreezedを使用したクラスを、
リストとして持っているState。
・リストをJSONで使用するため、下記2点を行う
◎fromJsonメソッドを追記する。
◎@JsonSerializable(explicitToJson: true)を追記する。
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:cardcsvreader/cardcsvdata/cardnameitem.dart';
part 'cardnameState.freezed.dart'; // for freezed
part 'cardnameState.g.dart'; // for json
@freezed
class cardNameState with _$cardNameState{
@JsonSerializable(explicitToJson: true) // オブジェクトを入れるため、ここに一行追加
const factory cardNameState({
@Default(<cardNameItem>[]) List<cardNameItem> cardNameList,
@Default(0) int displayItemIndex,
}) = _cardNameState;
factory cardNameState.fromJson(Map<String , dynamic> json) =>
_$cardNameStateFromJson(json);
}
・ターミナルで flutter pub run build_runner build
テスト用コード
// Json
void DebugPrintJSONCardNameList(){
print( jsonEncode(state.toJson()) ); //jsonを文字列で表示する
}
void DebugReadJSONFromList(){
state = cardNameState.fromJson( jsonDecode(_testjsonCardList) ); // JSONの文字列を読み込んで使ってみる。
}
ローカル時間のDateTime をJosnで使用する
DateTimeをJsonで使用するとき、UTC時間で表示されてしまうのを修正する。
・以下のコードでDateTimeConverterを実装しておく。
misc.dartとして、流用できるようにしておくとよい。
必要なパッケージは適時読み込むこと。
// DateTime for Json
class DateTimeConverter implements JsonConverter<DateTime, String> {
const DateTimeConverter();
@override
DateTime fromJson(String json) {
return DateTime.parse(json).toLocal();
}
@override
String toJson(DateTime dateTime) {
return dateTime.toLocal().toString();
}
}
・@freezedの宣言内で DateTimeを使用する
@DateTimeConverter() required DateTime CreateTime, // DateTime用のjsonconverterを使用 misc.dart
DateTimeをFreezed・Jsonで使用するとき、
DateTimeConverterのfromJson()とtoJason()を使うようにすれば、時刻のずれが修正される。