fromJson static method

PipExpanded? fromJson(
  1. Map<String, dynamic>? json, {
  2. DesignTokenCatalog designTokens = DesignTokenCatalog.empty,
})

Returns null when the expanded canvas is missing or unparseable — with onTap: expand as the default, a PiP that cannot open is a dead end, so the whole campaign is dropped rather than shipped half-working.

Implementation

static PipExpanded? fromJson(
  Map<String, dynamic>? json, {
  DesignTokenCatalog designTokens = DesignTokenCatalog.empty,
}) {
  if (json == null) return null;
  final canvasJson = optMap(json, 'canvas');
  if (canvasJson == null || canvasJson.isEmpty) return null;
  final CampaignCanvas canvas;
  try {
    canvas =
        CampaignCanvasParser(designTokens: designTokens).parse(canvasJson);
  } on FormatException {
    // A canvas written by a newer dashboard than this SDK understands. Drop
    // the campaign rather than throw through the campaign-list parse and take
    // every other campaign down with it.
    return null;
  }
  final rawDesignWidth =
      optDouble(json, 'designWidth', defaultCampaignCanvasDesignWidth);
  return PipExpanded(
    canvas: canvas,
    designWidth: rawDesignWidth > 0
        ? rawDesignWidth
        : defaultCampaignCanvasDesignWidth,
    cover: optString(json, 'mediaFit', 'cover') != 'contain',
    backgroundColor: parseNudgeColor(optString(json, 'backgroundColor')),
    scrimOpacity: optDouble(json, 'scrimOpacity', 0.55).clamp(0.0, 1.0),
    showCloseButton: optBool(json, 'showCloseButton', true),
    closeOnLeft: optString(json, 'closePlacement', 'top_right') == 'top_left',
    onClose: PipExpandedClose.from(optString(json, 'onClose')),
    onBack: PipExpandedClose.from(optString(json, 'onBack')),
    showPlaybackControls: optBool(json, 'showPlaybackControls', false),
    showMute: optBool(json, 'showMute', true),
    unmuteOnExpand: optBool(json, 'unmuteOnExpand', false),
    transition: Duration(milliseconds: optInt(json, 'transitionMs', 500)),
    iconSize: optDouble(json, 'iconSize', 20).clamp(14, 32),
    controlsMargin: PipEdges.fromJsonWithDefault(
      optMap(json, 'controlsMarginDp'),
      const PipEdges(top: 4, right: 12, bottom: 0, left: 12),
    ),
  );
}