Generic widget that builds itself depending on the derived class of current value.

Define classes hierarchy:

abstract class Animal { static Animal get random => Random().nextBool() ? Doge() : Cate(); } class Doge extends Animal { final int badDeeds = 0; final int goodDeeds = Random().nextInt(20); } class Cate extends Animal { static final _breeds = ['Oriental', 'Birman', 'Tonkinese']; final String breed = _breeds[Random().nextInt(_breeds.length)]; final bool friendly = Random().nextBool(); }

Create widget and pass it necessary builder functions:

// ... child: AbstractWidget<Animal>(Animal.random) ..when<Doge>((doge) => Text('wow. such widget.')) // It's also correct to omit type parameters as they will // be inferred depending on argument type of the builder. ..when((Doge doge) => Center( child: Column(mainAxisSize: MainAxisSize.min, children: [ Text('Bad deeds: ${doge.badDeeds}'), Text('Good deeds: ${doge.goodDeeds}'), ]), )) ..when<Cate>(_buildCate), Widget _buildCate(Cate cate) { // build cate widget here }