set<T> method

  1. @override
void set<T>(
  1. StateSlot<T> key,
  2. T value
)

(en) Sets the value for the specified slot. Any listeners associated with the slot will be notified of the change.

(ja) 指定されたスロットに関して値をセットします。 スロットと紐付いたリスナーに変更が通知されます。

  • key : Target slot.
  • value : The value to set.

Implementation

@override
void set<T>(StateSlot<T> key, T value) {
  if (!_data.containsKey(key.name)) {
    throw StateError('StateSlot "${key.name}" is not initialized');
  }
  final oldValue = _data[key.name] as T;
  // 型チェック
  UtilCopy.validateJsonableOrClonableFile<T>(
    value,
    key,
    context: 'state slot "$key.name"',
  );
  if (key.caster != null) {
    _data[key.name] = key.caster!(
      UtilCopy.deepCopyJsonableOrClonableFile(value),
    );
    _debugListener?.call(
      key,
      key.caster!(UtilCopy.deepCopyJsonableOrClonableFile(oldValue)),
      key.caster!(UtilCopy.deepCopyJsonableOrClonableFile(value)),
    );
  } else {
    _data[key.name] = UtilCopy.deepCopyJsonableOrClonableFile(value) as T;
    // Untyped but safe deep copy (Map<String, dynamic>, List<dynamic>, primitives)
    _debugListener?.call(
      key,
      UtilCopy.deepCopyJsonableOrClonableFile(oldValue) as T,
      UtilCopy.deepCopyJsonableOrClonableFile(value) as T,
    );
  }
  _notify(key);
  // バッチ処理中でなければ_stateListenerに通知する。
  if (!_isBatch) {
    _flushStateListener();
  }
}