CNFoldableState.fromMap constructor

CNFoldableState.fromMap(
  1. Map<Object?, Object?>? map
)

Parses the map sent by the native side.

Implementation

factory CNFoldableState.fromMap(Map<Object?, Object?>? map) {
  if (map == null || map['supported'] != true) return unsupported;
  final hingeMap = map['hinge'] as Map<Object?, Object?>?;
  final regionMaps = (map['regions'] as List<Object?>?) ?? const <Object?>[];
  double d(Map<Object?, Object?> m, String k) =>
      (m[k] as num?)?.toDouble() ?? 0;
  return CNFoldableState(
    isSupported: true,
    hinge: hingeMap == null
        ? null
        : CNHinge(
            status: switch (hingeMap['status']) {
              'closed' => CNHingeStatus.closed,
              'partiallyOpen' => CNHingeStatus.partiallyOpen,
              'fullyOpen' => CNHingeStatus.fullyOpen,
              _ => CNHingeStatus.unknown,
            },
            angle: d(hingeMap, 'angle'),
          ),
    verticalBarSide: switch (map['verticalBarSide']) {
      'left' => CNVerticalBarSide.left,
      'right' => CNVerticalBarSide.right,
      _ => CNVerticalBarSide.none,
    },
    regions: <CNReservedRegion>[
      for (final raw in regionMaps)
        if (raw is Map<Object?, Object?>)
          CNReservedRegion(
            kind: raw['kind'] == 'division'
                ? CNReservedRegionKind.division
                : CNReservedRegionKind.occlusion,
            frame: Rect.fromLTWH(
              d(raw, 'x'),
              d(raw, 'y'),
              d(raw, 'width'),
              d(raw, 'height'),
            ),
            margins: EdgeInsets.fromLTRB(
              d(raw, 'marginLeft'),
              d(raw, 'marginTop'),
              d(raw, 'marginRight'),
              d(raw, 'marginBottom'),
            ),
            isActive: raw['active'] == true,
          ),
    ],
  );
}