abstract_widget

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


License
MIT

Documentation

AbstractWidget

pub package

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

AbstractWidget example

Usage

  1. 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();
}
  1. 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.