SizedBox and ConstrainedBox
Precisely controlling widget sizes is crucial in UI layout design. Flitter provides SizedBox
and ConstrainedBox
to fine-tune widget dimensions with precision.
Learning Objectives
After completing this tutorial, you’ll be able to:
- Set fixed widget sizes using SizedBox
- Apply size constraints to widgets using ConstrainedBox
- Combine size control widgets to create complex layouts
- Understand the differences between minimum and maximum size constraints
Core Concepts
SizedBox
SizedBox
is a widget that provides fixed dimensions to its child widget. You can specify exact width and height, making it ideal for UI elements that require fixed sizing.
ConstrainedBox
ConstrainedBox
is a widget that applies size constraints to its child widget. You can specify minimum and maximum sizes to limit the widget’s size adjustment within a specific range.
Basic Usage
Setting Fixed Size with SizedBox
import { SizedBox, Container, Text } from "@meursyphus/flitter";
const fixedSizeWidget = SizedBox({
width: 200,
height: 100,
child: Container({
color: '#3B82F6',
child: Text("200x100 Fixed Size")
})
});
Setting Size Constraints with ConstrainedBox
import { ConstrainedBox, Constraints, Container, Text } from "@meursyphus/flitter";
const constrainedWidget = ConstrainedBox({
constraints: new Constraints({
minWidth: 100,
maxWidth: 300,
minHeight: 50,
maxHeight: 150,
}),
child: Container({
color: '#10B981',
child: Text("Size-constrained Widget")
})
});
Step-by-Step Practice
Step 1: Basic SizedBox Usage
Let’s start by creating a simple SizedBox.
import { SizedBox, Container, Text } from "@meursyphus/flitter";
const widget = SizedBox({
width: 150,
height: 80,
child: Container({
color: '#EF4444',
child: Text("SizedBox Test")
})
});
Step 2: Applying ConstrainedBox
Now let’s use ConstrainedBox to add size constraints.
import { ConstrainedBox, Constraints, Container, Text } from "@meursyphus/flitter";
const widget = ConstrainedBox({
constraints: new Constraints({
minWidth: 120,
maxWidth: 200,
minHeight: 60,
maxHeight: 100,
}),
child: Container({
color: '#8B5CF6',
child: Text("Constraint Test")
})
});
Step 3: Combining SizedBox and ConstrainedBox
Let’s combine both widgets to implement more complex size control.
import { SizedBox, ConstrainedBox, Constraints, Container, Text } from "@meursyphus/flitter";
const widget = SizedBox({
width: 250,
height: 150,
child: ConstrainedBox({
constraints: new Constraints({
minWidth: 200,
maxWidth: 300,
minHeight: 100,
maxHeight: 200,
}),
child: Container({
color: '#F59E0B',
child: Text("Combined Size Control")
})
})
});
Practice Problems
Problem 1: Creating a Fixed-Size Card
Use SizedBox to create a card widget with dimensions 200x120.
// TODO: Implement card widget using SizedBox
const cardWidget = // Write your code here
Problem 2: Applying Flexible Size Constraints
Use ConstrainedBox to create a widget with minimum width 100, maximum width 300, minimum height 50, and maximum height 150.
// TODO: Implement flexible size constraints with ConstrainedBox
const flexibleWidget = // Write your code here
Problem 3: Complex Size Control
Combine SizedBox and ConstrainedBox to create a widget with fixed outer size and flexible inner size.
// TODO: Implement complex size control widget
const complexWidget = // Write your code here
Expected Results
After completing this tutorial:
- Fixed-size Widget: Widget with exact dimensions specified by SizedBox
- Constrained Widget: Widget with size range limited by ConstrainedBox
- Complex Size Control: Complex layout combining both widgets
Additional Challenges
Responsive Size Control
Create a widget that applies different size constraints based on screen size.
import { ConstrainedBox, Constraints, Container, Text } from "@meursyphus/flitter";
// Responsive size constraint example
const responsiveWidget = ConstrainedBox({
constraints: new Constraints({
minWidth: 150,
maxWidth: 400,
minHeight: 100,
maxHeight: 250,
}),
child: Container({
color: '#06B6D4',
child: Text("Responsive Size Control")
})
});
Nested Size Control
Create complex layouts by nesting multiple levels of size control.
import { SizedBox, ConstrainedBox, Constraints, Container, Text } from "@meursyphus/flitter";
const nestedSizeControl = SizedBox({
width: 300,
height: 200,
child: ConstrainedBox({
constraints: new Constraints({
minWidth: 250,
maxWidth: 350,
minHeight: 150,
maxHeight: 250,
}),
child: SizedBox({
width: 280,
height: 180,
child: Container({
color: '#8B5CF6',
child: Text("Nested Size Control")
})
})
})
});
Common Mistakes
1. Conflicting Constraints
// ❌ Wrong: Conflicting constraints
const conflictingConstraints = ConstrainedBox({
constraints: new Constraints({
minWidth: 200,
maxWidth: 150, // Maximum smaller than minimum
}),
child: Container({
child: Text("Error occurs")
})
});
// ✅ Correct: Consistent constraints
const validConstraints = ConstrainedBox({
constraints: new Constraints({
minWidth: 150,
maxWidth: 200, // Maximum larger than minimum
}),
child: Container({
child: Text("Works correctly")
})
});
2. Unnecessary Nesting
// ❌ Wrong: Unnecessary SizedBox nesting
const unnecessaryNesting = SizedBox({
width: 200,
height: 100,
child: SizedBox({
width: 200,
height: 100,
child: Container({
child: Text("Duplicate size setting")
})
})
});
// ✅ Correct: Simple size setting
const simpleSize = SizedBox({
width: 200,
height: 100,
child: Container({
child: Text("Simple size setting")
})
});
3. Constraints Object Creation Error
// ❌ Wrong: Missing new keyword
const wrongConstraints = ConstrainedBox({
constraints: Constraints({
minWidth: 100,
maxWidth: 200,
}),
child: Container({
child: Text("Error occurs")
})
});
// ✅ Correct: Using new keyword
const correctConstraints = ConstrainedBox({
constraints: new Constraints({
minWidth: 100,
maxWidth: 200,
}),
child: Container({
child: Text("Works correctly")
})
});
Next Steps
Once you’ve mastered size control, proceed to the next topics:
- Align and Center: Widget alignment and centering
- Padding and Margin: Widget spacing and margin control
- Expanded and Flexible: Flexible layout composition
Now you can precisely control widget sizes using SizedBox and ConstrainedBox!