A simple library for applying the Humble Object Pattern in order to create clean, testable widgets.
This package might be helpful to you if:
- a high level of test coverage is required
- you apply test driven development to app development
- you find it difficult to separate UI logic from appearance
- the widgets you create depend on too many details
Using the library will feel very familiar. Let's start by creating a simple button as a HumbleStatelessWidget.
- Write a test! (skip ahead if you still haven't been converted to TDD 😜). Be sure to include tests for all logic that is important to you. This may include strings, colors, padding -- anything that is necessary to make the widget "right".
bool testSimpleButtonLogic(){
bool tapped = false;
final logic = SimpleButtonLogic(text: 'test', onTap: () {
tapped = true;
});
if (logic.text != 'test') return false;
logic.onTap();
if (tapped == false) return false;
return true;
}
- Create a plain old Dart object to represent the UI element's logic.
class SimpleButtonLogic {
SimpleButtonLogic({required this.text, required this.onTap});
final String text;
final Function() onTap;
}
- Once your class passes it's tests, you will use it to create your widget. Use the logic getter to access your widget's logic.
class SimpleButton extends HumbleStatelessWidget<SimpleButtonLogic> {
SimpleButton(SimpleButtonLogic logic) : super(logic, key: Key('SimpleButton'));
@override
Widget build(BuildContext context) {
return ElevatedButton(
child: Text(logic.text),
onPressed: () => logic.onTap(),
);
}
}
That's it! You now have a testable (albeit simple) widget! Take a look at the example folder for creating a HumbleStatefulWidget.
The amount of source code in the library is minuscule, and it doesn't constitute anything new or bleeding-edge. However, use of this library will help the average developer apply high level and highly-esteemed software engineering principles to their code.
Learn more about the Humble Object Pattern here: https://martinfowler.com/bliki/HumbleObject.html.
Contribute at https://github.com/brettlaws/flutter_hop.