True only when endsAt is set and already in the past. A poll with no endsAt never ends.
bool get hasEnded => endsAt?.isBefore(DateTime.now()) ?? false;