🐕

mono さんから学んだこと

2024/03/17に公開

これは mono さんっていう Flutter 超絶スーパーハイクラスエンジニア様のGitHubで弱小エンジニアが学んだ事の記録です。

https://github.com/mono0926/wdb106-flutter?tab=readme-ov-file

ref.listen

ref.listen<bool>(cartProvider.select((s) => s.isEmpty), (_, shouldPop) {
  pop();
});

ただの provider を入れるだけかと思ってたけど
bool とかを設定できるなんて・・・

notifier の概念が崩壊

notifier
@riverpod
class Cart extends _$Cart {
  @override
  CartState build() => CartState();

  void add(String id) => state = state.added(id);
  void delete(String id) => state = state.deleted(id);
}
state
@freezed
class CartState with _$CartState {
  factory CartState([@Default(<String, int>{}) Map<String, int> map]) =
      _CartState;
  CartState._();

  CartState added(String id) {
    return CartState({
      ...map,
      id: (map[id] ?? 0) + 1,
    });
  }

  CartState deleted(String id) {
    return CartState(
      {
        ...map,
        id: map[id]! - 1,
      }..removeWhere((key, quantity) => quantity <= 0),
    );
  }

  late final itemIds = map.keys.toList()..sort((a, b) => a.compareTo(b));
  late final totalQuantity = map.values.fold<int>(
    0,
    (sum, quantity) {
      return sum + quantity;
    },
  );
  late final isEmpty = totalQuantity <= 0;

  int quantity(String id) => map[id] ?? 0;
}

なにこれ。
処理とかは riverpod の notifier 内で書くものって思ってたけど
state クラスの中で書いてる。
ヤバい。かっこよすぎる。

Discussion