userFraction property
Play's userFraction, exactly as sent — the authoritative value.
Null when Play sent none.
Google sets it only for PlayReleaseStatus.inProgress and
PlayReleaseStatus.halted, and documents it as 0 < fraction < 1 —
cited, and caveated, on PlayReleaseStatus.audienceFraction. So null
here is not "no rollout": a PlayReleaseStatus.completed release
carries no fraction precisely because it reached everybody, which is the
one case where reading this field instead of audienceFraction gives the
opposite of the right answer.
And it is load-bearing even for a caller that never reads it. It is the second input to audienceFraction, so carrying it is what lets a caller recompute that field rather than trust it — and PlayReleaseStatus.audienceFraction states why the recomputation, not this field's nullness, is what survives Google's documented range being wrong.
Unread and load-bearing are compatible, which is worth saying because the two get filed together. A field nobody reads can usually be deleted at no cost to anyone; deleting this one would leave audienceFraction checkable only against a sentence in a dependency's generated dartdoc. Unread is a fact about callers, load-bearing is a fact about the document, and only the first is an argument about whether a field earns its place.
Spelled with Play's own key rather than as a *Raw sibling, which the
enums beside it need because ours and theirs share a name. Here they do
not, so there is one name per fact instead of three names for two.
Implementation
final double? userFraction;