AbstractWidget
Generic widget that builds itself depending on the derived class of current value.
Usage
- 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
}
Note
Be cautious when passing builder functions without explicitly specifying generic type argument (like ..when((Doge doge) => ...)
in the example above). In case of an incompatible type, Dart analyzer won't mark it as error, which will result in runtime exception.