Compositions
compositionmeans building complex widgets by combining simpler widgets.
- Use
Compositioninstead ofInheritanceto extend Widgets which are already defined or which already extend a StatelessWidget.
Must know for composition
Extract Widget
- in Android Studio put your cursor on
WidgetName, right-click and choose Refactor ▸ Extract ▸ Method from the context menu. - in VS Code put your cursor on
WidgetName,CTRL+.or [right-click and choose Refactor] ▸ choose Extract ▸ Method from the menu.
caution
Error: Reference to an enclosing class method cannot be extracted.
Solution: If you want to use "Extract Widget" only then simply wrap that widget in a Container and then use "Extract Widget" on that widget. If that doesn't work, comment out setState() function inside the widget and try again.
Extract Method OR Private Helper MKethod
This is known as Private Helper Method
- in Android Studio: put your cursor on
WidgetName, right-click and choose Refactor ▸ Extract ▸ Method from the context menu. - in VS Code: put your cursor on
WidgetName,CTRL+.or [right-click and choose Refactor] ▸ choose Extract ▸ Method from the menu.
info
when given widget is to be used again and again with same components but only different icons or text then use : Composition in the form of creating a Method of return type of that WidgetName with Named Parameters and can call that method from anywhere we want with different parameter values
name that method private variable i.e.
_nameYouGive
caution
when Extract Method then must use static in that funtion declaration or else when that function is called we get error : The instance member '_buildButtonColumn' can't be accessed in an initializer. Try replacing the reference to the instance member with a different expression
final Widget buttonRow = Container(
padding: const EdgeInsets.all(32),
child: Row(
children: [
_buildButtonColumn(Colors.red, Icons.abc, 'Alphabet'), /// The instance member '_buildButtonColumn' can't be accessed in an initializer. Try replacing the reference to the instance member with a different expression
_buildButtonColumn(Colors.red, Icons.star, 'Star'), /// The instance member '_buildButtonColumn' can't be accessed in an initializer. Try replacing the reference to the instance member with a different expression
_buildButtonColumn(Colors.red, Icons.add, 'Add'), /// The instance member '_buildButtonColumn' can't be accessed in an initializer. Try replacing the reference to the instance member with a different expression
],
),
);
static Column _buildButtonColumn(Color color, IconData icon, String label) => Column(
mainAxisSize: MainAxisSize.min,
children: [
Icon(icon, color: color),
Text(
label,
style: TextStyle(
fontSize: 12, fontWeight: FontWeight.w400, color: color),
)
],
);