How to reuse non Widget classes in Flutter?

573

Sure. The "don't extend widgets" is really limited to that: widgets.

The real reason behind that "limitation" is that extending widgets do not allow to properly change the style of a widget, due to how build works. So extending widgets do not make sense.

But that reason does not apply to other kinds of objects. So don't worry and go ahead!

There are many examples available in Flutter already. For example, Alignment is a subclass of AlignmentGeometry.

Share:
573
Rod
Author by

Rod

Updated on December 13, 2022

Comments

  • Rod
    Rod over 1 year

    I know we are supposed to use composition over inheritance in Flutter. And that works great when we are talking about Widgets.

    But what am I supposed to do when a class is not a Widget? For example, I want my TextFields in some screens to have a specific set of values in their InputDecoration.

    Should I extend InputDecoration? How can I reuse this specific InputDecoration in many TextFields?

    EDIT: Following Rémi Rousselet's guidance, I extended InputDecoration. Here's the final result:

    
    class LoginInputDecoration extends InputDecoration {
      @override
      InputBorder get errorBorder =>
          UnderlineInputBorder(borderSide: BorderSide(color: AppColors.danger));
    
      @override
      EdgeInsetsGeometry get contentPadding => const EdgeInsets.symmetric(
            horizontal: Dimens.halfSpace,
            vertical: Dimens.singleSpace,
          );
    
      @override
      InputBorder get border =>
          UnderlineInputBorder(borderSide: BorderSide(color: AppColors.primary));
    
      @override
      TextStyle get labelStyle =>
          TextStyle(color: AppColors.white, decorationColor: AppColors.white);
    
      @override
      InputBorder get enabledBorder =>
          UnderlineInputBorder(borderSide: BorderSide(color: AppColors.primary));
    
      @override
      TextStyle get hintStyle =>
          TextStyle(color: AppColors.white, decorationColor: AppColors.white);
    
      LoginInputDecoration({String labelText}) : super(labelText: labelText);
    }
    
  • Rod
    Rod almost 5 years
    Thanks! You are right, I managed to solve this using inheritance. I'll update my question with some code to show it.