convertTo method
DynamicMap?
convertTo(
- String key,
- Object? value,
- DynamicMap original, [
- FirestoreModelAdapterBase? adapter,
override
Convert from ModelFieldValue to a type that can be managed by Firestore.
Generate and return a DynamicMap value from key
and value
. original
is passed the DynamicMap before conversion.
Return Null if there are no changes.
FirestoreModelAdapterBase is passed to adapter
.
ModelFieldValueからFirestoreで管理可能な型に変換します。
key
とvalue
からDynamicMapの値を生成して返してください。original
は変換前のDynamicMapを渡します。
変更がない場合はNullを返してください。
adapter
にFirestoreModelAdapterBaseが渡されます。
Implementation
@override
DynamicMap? convertTo(
String key,
Object? value,
DynamicMap original, [
FirestoreModelAdapterBase? adapter,
]) {
if (value is DynamicMap && value.containsKey(_kTypeKey)) {
final type = value.get(_kTypeKey, "");
if (type == this.type) {
final fromUser = value.get(ModelCounter.kSourceKey, "") ==
ModelFieldValueSource.user.name;
final count = value.get<num>(ModelCounter.kValueKey, 0.0);
final increment = value.get<num>(ModelCounter.kIncrementKey, 0.0);
final targetKey = "#$key";
return {
targetKey: {
kTypeFieldKey: this.type,
ModelCounter.kValueKey: count,
ModelCounter.kIncrementKey: increment,
_kTargetKey: key,
},
key: fromUser ? count : FieldValue.increment(increment),
};
}
} else if (value is List) {
final list = value.whereType<DynamicMap>();
if (list.isNotEmpty && list.every((e) => e.get(_kTypeKey, "") == type)) {
final target = <DynamicMap>[];
final res = <Object>[];
final targetKey = "#$key";
for (final entry in list) {
final fromUser = entry.get(ModelCounter.kSourceKey, "") ==
ModelFieldValueSource.user.name;
final count = entry.get<num>(ModelCounter.kValueKey, 0.0);
final increment = entry.get<num>(ModelCounter.kIncrementKey, 0.0);
target.add({
kTypeFieldKey: type,
ModelCounter.kValueKey: count,
ModelCounter.kIncrementKey: increment,
_kTargetKey: key,
});
res.add(fromUser ? count : FieldValue.increment(increment));
}
return {
targetKey: target,
key: res,
};
}
} else if (value is Map) {
final map = value
.where((key, value) => value is DynamicMap)
.cast<String, DynamicMap>();
if (map.isNotEmpty &&
map.values.every((e) => e.get(_kTypeKey, "") == type)) {
final target = <String, DynamicMap>{};
final res = <String, Object>{};
final targetKey = "#$key";
for (final entry in map.entries) {
final fromUser = entry.value.get(ModelCounter.kSourceKey, "") ==
ModelFieldValueSource.user.name;
final count = entry.value.get<num>(ModelCounter.kValueKey, 0.0);
final increment =
entry.value.get<num>(ModelCounter.kIncrementKey, 0.0);
target[entry.key] = {
kTypeFieldKey: type,
ModelCounter.kValueKey: count,
ModelCounter.kIncrementKey: increment,
_kTargetKey: key,
};
res[entry.key] = fromUser ? count : FieldValue.increment(increment);
}
return {
targetKey: target,
key: res,
};
}
}
return null;
}