fromJson static method
PipExpanded?
fromJson(
- Map<
String, dynamic> ? json, { - 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),
),
);
}