Popular Searches
Popular Course Categories
Popular Courses

Creating layered UI designs

Creating layered UI designs

Flutter Layout & UI Design

Creating Layered UI Designs in Flutter

Layered UI design means placing multiple visual elements on top of one another to create rich and interactive interfaces. Flutter provides widgets such as Stack, Positioned, Align, Container, DecoratedBox, Opacity, ClipRRect, and FractionallySizedBox that can be combined to create layered interfaces.

A common layered design contains a background image, a color or gradient overlay, text, badges, icons, buttons, and other controls. Flutter's Stack widget is specifically designed for overlapping children, with later children painted above earlier children. :contentReference[oaicite:0]{index=0}


1. What Is a Layered UI?

A layered UI is an interface in which multiple widgets occupy the same visual area and are displayed at different levels.

Layer 4 → Button
Layer 3 → Text
Layer 2 → Gradient Overlay
Layer 1 → Image
Layer 0 → Background

For example, a course banner can contain:

  • A background image
  • A dark transparent overlay
  • A course title
  • A course description
  • A badge
  • A button

2. Why Use Layered UI Designs?

Layered designs can make an application visually attractive and allow developers to place related UI elements within a single visual composition.

  • Image banners with text
  • Profile images with status badges
  • Product cards with discount labels
  • Notification badges
  • Video controls over videos
  • Hero sections
  • Dashboard cards
  • Floating action elements
  • Loading overlays
  • Onboarding screens
  • Image galleries
  • Custom promotional cards

3. Stack Widget

The Stack widget positions its children relative to the edges of its box and allows multiple children to overlap. Non-positioned children participate in determining the Stack's size, while positioned children are placed according to their positioning properties. :contentReference[oaicite:1]{index=1}

Stack(
  children: [
    Container(
      width: 300,
      height: 200,
      color: Colors.blue,
    ),
    const Text(
      'Layered Text',
      style: TextStyle(
        color: Colors.white,
        fontSize: 24,
      ),
    ),
  ],
)

4. Understanding Stack Layers

The order of widgets inside children determines the painting order. The first child is painted at the bottom, and later children are painted above it. :contentReference[oaicite:2]{index=2}

Stack(
  children: [
    Background(),  // Layer 1
    Image(),       // Layer 2
    Overlay(),     // Layer 3
    Text(),        // Layer 4
    Button(),      // Layer 5
  ],
)

5. Basic Layered Container

Stack(
  children: [
    Container(
      width: 350,
      height: 220,
      decoration: BoxDecoration(
        color: Colors.blue,
        borderRadius: BorderRadius.circular(20),
      ),
    ),
    const Center(
      child: Text(
        'Flutter Layered UI',
        style: TextStyle(
          color: Colors.white,
          fontSize: 26,
          fontWeight: FontWeight.bold,
        ),
      ),
    ),
  ],
)

6. Positioned Widget

Positioned provides more precise placement for a child inside a Stack. It can use properties such as top, right, bottom, left, width, and height.

Stack(
  children: [
    Container(
      width: 350,
      height: 220,
      color: Colors.grey,
    ),
    Positioned(
      left: 20,
      top: 20,
      child: const Text(
        'Top Left',
        style: TextStyle(
          fontSize: 20,
          color: Colors.white,
        ),
      ),
    ),
    Positioned(
      right: 20,
      bottom: 20,
      child: const Text(
        'Bottom Right',
        style: TextStyle(
          fontSize: 20,
          color: Colors.white,
        ),
      ),
    ),
  ],
)

7. Layered UI Using Alignment

Not every element needs explicit coordinates. Stack's alignment property can align non-positioned children.

Stack(
  alignment: Alignment.center,
  children: [
    Container(
      width: 300,
      height: 200,
      color: Colors.indigo,
    ),
    const Text(
      'Centered Content',
      style: TextStyle(
        color: Colors.white,
        fontSize: 24,
      ),
    ),
  ],
)

Stack supports alignment values such as Alignment.center, Alignment.topLeft, Alignment.topRight, Alignment.bottomLeft, and Alignment.bottomRight. :contentReference[oaicite:3]{index=3}

8. Creating an Image Overlay

One of the most common layered UI patterns is placing content over an image.

Stack(
  children: [
    Image.network(
      'https://example.com/banner.jpg',
      width: double.infinity,
      height: 250,
      fit: BoxFit.cover,
    ),
    const Positioned(
      left: 20,
      bottom: 20,
      child: Text(
        'Flutter Development',
        style: TextStyle(
          color: Colors.white,
          fontSize: 28,
          fontWeight: FontWeight.bold,
        ),
      ),
    ),
  ],
)

9. Adding a Transparent Overlay

A transparent overlay can be placed above an image and below foreground content.

Stack(
  children: [
    Image.network(
      'https://example.com/banner.jpg',
      width: double.infinity,
      height: 250,
      fit: BoxFit.cover,
    ),
    Positioned.fill(
      child: Container(
        color: Colors.black54,
      ),
    ),
    const Positioned(
      left: 20,
      bottom: 20,
      child: Text(
        'Learn Flutter',
        style: TextStyle(
          color: Colors.white,
          fontSize: 28,
          fontWeight: FontWeight.bold,
        ),
      ),
    ),
  ],
)

10. Using Positioned.fill

Positioned.fill is useful when a layer should cover the entire Stack area.

Stack(
  children: [
    Container(
      color: Colors.blue,
    ),
    Positioned.fill(
      child: Container(
        color: Colors.black38,
      ),
    ),
    const Center(
      child: Text(
        'Overlay',
        style: TextStyle(
          color: Colors.white,
          fontSize: 25,
        ),
      ),
    ),
  ],
)

11. Creating a Gradient Overlay

Gradient overlays are useful when text needs to remain readable over an image.

Stack(
  children: [
    Image.network(
      'https://example.com/image.jpg',
      width: double.infinity,
      height: 300,
      fit: BoxFit.cover,
    ),
    Positioned.fill(
      child: Container(
        decoration: const BoxDecoration(
          gradient: LinearGradient(
            begin: Alignment.topCenter,
            end: Alignment.bottomCenter,
            colors: [
              Colors.transparent,
              Colors.black87,
            ],
          ),
        ),
      ),
    ),
    const Positioned(
      left: 20,
      bottom: 20,
      child: Text(
        'Beautiful Destination',
        style: TextStyle(
          color: Colors.white,
          fontSize: 26,
          fontWeight: FontWeight.bold,
        ),
      ),
    ),
  ],
)

12. Understanding the Layer Order

Consider the following structure:

Stack(
  children: [
    Image.network(...),
    Positioned.fill(
      child: Container(color: Colors.black45),
    ),
    const Positioned(
      bottom: 20,
      child: Text('Title'),
    ),
    Positioned(
      right: 20,
      bottom: 20,
      child: ElevatedButton(
        onPressed: () {},
        child: Text('Open'),
      ),
    ),
  ],
)

The visual hierarchy is:

  1. Image appears at the bottom.
  2. Transparent overlay appears above the image.
  3. Title appears above the overlay.
  4. Button appears above the title layer.

13. Profile Picture with Status Badge

Stack(
  clipBehavior: Clip.none,
  children: [
    const CircleAvatar(
      radius: 50,
      backgroundImage: NetworkImage(
        'https://example.com/profile.jpg',
      ),
    ),
    Positioned(
      right: 0,
      bottom: 0,
      child: Container(
        width: 22,
        height: 22,
        decoration: BoxDecoration(
          color: Colors.green,
          shape: BoxShape.circle,
          border: Border.all(
            color: Colors.white,
            width: 3,
          ),
        ),
      ),
    ),
  ],
)

This pattern is commonly used for online/offline indicators.

14. Notification Badge

Stack(
  clipBehavior: Clip.none,
  children: [
    const Icon(
      Icons.notifications,
      size: 35,
    ),
    Positioned(
      right: -6,
      top: -6,
      child: Container(
        padding: const EdgeInsets.all(5),
        decoration: const BoxDecoration(
          color: Colors.red,
          shape: BoxShape.circle,
        ),
        child: const Text(
          '8',
          style: TextStyle(
            color: Colors.white,
            fontSize: 11,
            fontWeight: FontWeight.bold,
          ),
        ),
      ),
    ),
  ],
)

15. Product Card with Discount Badge

Card(
  clipBehavior: Clip.antiAlias,
  child: SizedBox(
    height: 280,
    child: Stack(
      children: [
        Positioned.fill(
          child: Image.network(
            'https://example.com/product.jpg',
            fit: BoxFit.cover,
          ),
        ),
        Positioned(
          top: 12,
          right: 12,
          child: Container(
            padding: const EdgeInsets.symmetric(
              horizontal: 10,
              vertical: 6,
            ),
            decoration: BoxDecoration(
              color: Colors.red,
              borderRadius: BorderRadius.circular(20),
            ),
            child: const Text(
              '20% OFF',
              style: TextStyle(
                color: Colors.white,
                fontWeight: FontWeight.bold,
              ),
            ),
          ),
        ),
        Positioned(
          left: 16,
          right: 16,
          bottom: 16,
          child: Container(
            padding: const EdgeInsets.all(12),
            color: Colors.black54,
            child: const Text(
              'Smart Watch',
              style: TextStyle(
                color: Colors.white,
                fontSize: 20,
                fontWeight: FontWeight.bold,
              ),
            ),
          ),
        ),
      ],
    ),
  ),
)

16. Creating a Hero Banner

A hero banner is a large visual section that usually contains an image, overlay, heading, supporting text, and an action button.

Stack(
  children: [
    SizedBox(
      width: double.infinity,
      height: 400,
      child: Image.network(
        'https://example.com/hero.jpg',
        fit: BoxFit.cover,
      ),
    ),
    Positioned.fill(
      child: Container(
        decoration: const BoxDecoration(
          gradient: LinearGradient(
            begin: Alignment.centerLeft,
            end: Alignment.centerRight,
            colors: [
              Colors.black87,
              Colors.transparent,
            ],
          ),
        ),
      ),
    ),
    Positioned(
      left: 30,
      top: 100,
      right: 30,
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          const Text(
            'Learn Flutter',
            style: TextStyle(
              color: Colors.white,
              fontSize: 38,
              fontWeight: FontWeight.bold,
            ),
          ),
          const SizedBox(height: 12),
          const Text(
            'Build beautiful cross-platform applications.',
            style: TextStyle(
              color: Colors.white70,
              fontSize: 18,
            ),
          ),
          const SizedBox(height: 20),
          ElevatedButton(
            onPressed: () {},
            child: const Text('Get Started'),
          ),
        ],
      ),
    ),
  ],
)

17. Using Container for Visual Layers

Container is useful for creating background colors, borders, rounded corners, padding, gradients, and other visual layers.

Container(
  decoration: BoxDecoration(
    gradient: const LinearGradient(
      colors: [
        Colors.blue,
        Colors.purple,
      ],
    ),
    borderRadius: BorderRadius.circular(20),
  ),
)

18. Using BoxDecoration for Layered Design

BoxDecoration can provide gradients, images, borders, shadows, and shapes for a visual layer.

Container(
  decoration: BoxDecoration(
    gradient: const LinearGradient(
      colors: [
        Colors.indigo,
        Colors.blue,
      ],
    ),
    borderRadius: BorderRadius.circular(20),
    boxShadow: const [
      BoxShadow(
        blurRadius: 15,
        spreadRadius: 2,
        offset: Offset(0, 8),
        color: Colors.black26,
      ),
    ],
  ),
)

19. Layering with DecorationImage

An image can also be placed inside a BoxDecoration instead of using a separate Image widget. Flutter's DecorationImage represents an image used by a box decoration. :contentReference[oaicite:4]{index=4}

Container(
  decoration: BoxDecoration(
    image: const DecorationImage(
      image: NetworkImage(
        'https://example.com/background.jpg',
      ),
      fit: BoxFit.cover,
    ),
  ),
)

20. Image and Gradient in One Decoration

Container(
  decoration: BoxDecoration(
    image: const DecorationImage(
      image: NetworkImage(
        'https://example.com/banner.jpg',
      ),
      fit: BoxFit.cover,
    ),
    gradient: LinearGradient(
      colors: [
        Colors.black54,
        Colors.transparent,
      ],
    ),
  ),
)

For more complex layered interactions, using separate children inside Stack can make the layer order more explicit and easier to control.

21. Using Opacity for a Layer

The Opacity widget can make an entire widget partially transparent.

Stack(
  children: [
    Container(
      width: 300,
      height: 200,
      color: Colors.blue,
    ),
    Opacity(
      opacity: 0.5,
      child: Container(
        width: 300,
        height: 200,
        color: Colors.black,
      ),
    ),
    const Center(
      child: Text(
        'Overlay',
        style: TextStyle(
          color: Colors.white,
          fontSize: 24,
        ),
      ),
    ),
  ],
)

22. Using Align in Layered UI

Align can position a child using alignment values without requiring explicit top or left coordinates.

Stack(
  children: [
    Container(
      color: Colors.blue,
    ),
    const Align(
      alignment: Alignment.topRight,
      child: Padding(
        padding: EdgeInsets.all(16),
        child: Icon(
          Icons.favorite,
          color: Colors.white,
        ),
      ),
    ),
  ],
)

23. Align vs Positioned

AlignPositioned
Uses Alignment values.Uses top, right, bottom and left constraints.
Useful for general positioning.Useful for more precise positioning.
Can be used outside Stack.Designed for use as a Stack child.
Good for center/top/bottom alignment.Good for exact offsets and edges.

24. Using FractionallySizedBox

FractionallySizedBox can size its child to a fraction of the available width or height. This is useful for responsive layered components because the layer can scale with its parent instead of relying entirely on fixed dimensions. :contentReference[oaicite:5]{index=5}

Stack(
  children: [
    Container(
      height: 250,
      width: double.infinity,
      color: Colors.grey,
    ),
    FractionallySizedBox(
      widthFactor: 0.6,
      heightFactor: 1.0,
      alignment: Alignment.centerLeft,
      child: Container(
        color: Colors.black54,
      ),
    ),
  ],
)

25. Responsive Layered Design

A layered design should not depend unnecessarily on fixed coordinates. For responsive interfaces, use flexible sizing, constraints, alignment, and responsive breakpoints.

LayoutBuilder(
  builder: (context, constraints) {
    final isSmall = constraints.maxWidth < 600;

    return SizedBox(
      height: isSmall ? 250 : 400,
      width: double.infinity,
      child: Stack(
        children: [
          Positioned.fill(
            child: Container(
              color: Colors.indigo,
            ),
          ),
          Positioned(
            left: isSmall ? 16 : 40,
            right: isSmall ? 16 : 100,
            bottom: isSmall ? 20 : 40,
            child: Text(
              isSmall
                  ? 'Mobile Flutter UI'
                  : 'Responsive Flutter Layered UI',
              style: TextStyle(
                color: Colors.white,
                fontSize: isSmall ? 24 : 36,
                fontWeight: FontWeight.bold,
              ),
            ),
          ),
        ],
      ),
    );
  },
)

26. Layered Login Screen Design

Stack(
  children: [
    Positioned.fill(
      child: Container(
        decoration: const BoxDecoration(
          gradient: LinearGradient(
            begin: Alignment.topLeft,
            end: Alignment.bottomRight,
            colors: [
              Colors.blue,
              Colors.indigo,
            ],
          ),
        ),
      ),
    ),
    Center(
      child: Card(
        margin: const EdgeInsets.all(20),
        child: Padding(
          padding: const EdgeInsets.all(24),
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              const Text(
                'Login',
                style: TextStyle(
                  fontSize: 28,
                  fontWeight: FontWeight.bold,
                ),
              ),
              const SizedBox(height: 20),
              const TextField(
                decoration: InputDecoration(
                  labelText: 'Email',
                  border: OutlineInputBorder(),
                ),
              ),
              const SizedBox(height: 15),
              const TextField(
                obscureText: true,
                decoration: InputDecoration(
                  labelText: 'Password',
                  border: OutlineInputBorder(),
                ),
              ),
              const SizedBox(height: 20),
              SizedBox(
                width: double.infinity,
                child: ElevatedButton(
                  onPressed: () {},
                  child: const Text('Login'),
                ),
              ),
            ],
          ),
        ),
      ),
    ),
  ],
)

27. Layered Dashboard Card

Card(
  child: SizedBox(
    height: 180,
    child: Stack(
      children: [
        Positioned.fill(
          child: Container(
            decoration: const BoxDecoration(
              gradient: LinearGradient(
                colors: [
                  Colors.deepPurple,
                  Colors.indigo,
                ],
              ),
            ),
          ),
        ),
        const Positioned(
          left: 20,
          top: 20,
          child: Text(
            'Total Revenue',
            style: TextStyle(
              color: Colors.white70,
              fontSize: 16,
            ),
          ),
        ),
        const Positioned(
          left: 20,
          bottom: 25,
          child: Text(
            '₹85,000',
            style: TextStyle(
              color: Colors.white,
              fontSize: 30,
              fontWeight: FontWeight.bold,
            ),
          ),
        ),
        const Positioned(
          right: 20,
          top: 20,
          child: Icon(
            Icons.currency_rupee,
            color: Colors.white,
            size: 40,
          ),
        ),
      ],
    ),
  ),
)

28. Layered Loading Overlay

Stack can be used to place a loading layer above existing content.

Stack(
  children: [
    const Center(
      child: Text(
        'Application Content',
        style: TextStyle(fontSize: 22),
      ),
    ),
    if (isLoading)
      Positioned.fill(
        child: Container(
          color: Colors.black54,
          child: const Center(
            child: CircularProgressIndicator(),
          ),
        ),
      ),
  ],
)

This pattern can be useful when an application needs to visually block or cover content while an operation is in progress.

29. Video Player Overlay Concept

Stack(
  children: [
    Container(
      height: 250,
      width: double.infinity,
      color: Colors.black,
      child: const Center(
        child: Icon(
          Icons.play_circle,
          color: Colors.white,
          size: 70,
        ),
      ),
    ),
    Positioned(
      left: 15,
      right: 15,
      bottom: 15,
      child: Row(
        children: [
          const Icon(
            Icons.play_arrow,
            color: Colors.white,
          ),
          const SizedBox(width: 10),
          Expanded(
            child: LinearProgressIndicator(
              value: 0.4,
            ),
          ),
          const SizedBox(width: 10),
          const Text(
            '04:25',
            style: TextStyle(
              color: Colors.white,
            ),
          ),
        ],
      ),
    ),
  ],
)

30. Layered UI with ClipRRect

ClipRRect can be used when layered content needs rounded clipping.

ClipRRect(
  borderRadius: BorderRadius.circular(20),
  child: SizedBox(
    height: 250,
    child: Stack(
      children: [
        Positioned.fill(
          child: Image.network(
            'https://example.com/image.jpg',
            fit: BoxFit.cover,
          ),
        ),
        Positioned.fill(
          child: Container(
            color: Colors.black45,
          ),
        ),
        const Center(
          child: Text(
            'Rounded Layered Card',
            style: TextStyle(
              color: Colors.white,
              fontSize: 24,
              fontWeight: FontWeight.bold,
            ),
          ),
        ),
      ],
    ),
  ),
)

31. Creating Decorative Layers

Layered UI does not always need to contain functional widgets. Decorative shapes can also be layered behind content.

Stack(
  children: [
    Positioned(
      top: -50,
      right: -50,
      child: Container(
        width: 180,
        height: 180,
        decoration: const BoxDecoration(
          color: Colors.blue,
          shape: BoxShape.circle,
        ),
      ),
    ),
    Positioned(
      bottom: -60,
      left: -40,
      child: Container(
        width: 200,
        height: 200,
        decoration: const BoxDecoration(
          color: Colors.purple,
          shape: BoxShape.circle,
        ),
      ),
    ),
    const Center(
      child: Text(
        'Decorative UI',
        style: TextStyle(
          fontSize: 26,
          fontWeight: FontWeight.bold,
        ),
      ),
    ),
  ],
)

32. Creating a Modern Course Card

Card(
  elevation: 8,
  clipBehavior: Clip.antiAlias,
  child: SizedBox(
    height: 320,
    child: Stack(
      children: [
        Positioned.fill(
          child: Image.network(
            'https://example.com/flutter-course.jpg',
            fit: BoxFit.cover,
          ),
        ),
        Positioned.fill(
          child: Container(
            decoration: const BoxDecoration(
              gradient: LinearGradient(
                begin: Alignment.topCenter,
                end: Alignment.bottomCenter,
                colors: [
                  Colors.transparent,
                  Colors.black87,
                ],
              ),
            ),
          ),
        ),
        Positioned(
          top: 15,
          left: 15,
          child: Container(
            padding: const EdgeInsets.symmetric(
              horizontal: 10,
              vertical: 6,
            ),
            decoration: BoxDecoration(
              color: Colors.orange,
              borderRadius: BorderRadius.circular(20),
            ),
            child: const Text(
              'POPULAR',
              style: TextStyle(
                color: Colors.white,
                fontWeight: FontWeight.bold,
              ),
            ),
          ),
        ),
        const Positioned(
          left: 20,
          right: 20,
          bottom: 70,
          child: Text(
            'Flutter Development Course',
            style: TextStyle(
              color: Colors.white,
              fontSize: 24,
              fontWeight: FontWeight.bold,
            ),
          ),
        ),
        Positioned(
          left: 20,
          right: 20,
          bottom: 15,
          child: ElevatedButton(
            onPressed: () {},
            child: const Text('Enroll Now'),
          ),
        ),
      ],
    ),
  ),
)

33. Complete Layered UI Example

import 'package:flutter/material.dart';

void main() {
  runApp(const LayeredApp());
}

class LayeredApp extends StatelessWidget {
  const LayeredApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: const LayeredHomePage(),
    );
  }
}

class LayeredHomePage extends StatelessWidget {
  const LayeredHomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Layered UI'),
      ),
      body: SingleChildScrollView(
        padding: const EdgeInsets.all(16),
        child: Column(
          children: [
            SizedBox(
              height: 320,
              width: double.infinity,
              child: Stack(
                children: [
                  Positioned.fill(
                    child: ClipRRect(
                      borderRadius: BorderRadius.circular(20),
                      child: Image.network(
                        'https://example.com/flutter.jpg',
                        fit: BoxFit.cover,
                      ),
                    ),
                  ),
                  Positioned.fill(
                    child: ClipRRect(
                      borderRadius: BorderRadius.circular(20),
                      child: Container(
                        decoration: const BoxDecoration(
                          gradient: LinearGradient(
                            begin: Alignment.topCenter,
                            end: Alignment.bottomCenter,
                            colors: [
                              Colors.transparent,
                              Colors.black87,
                            ],
                          ),
                        ),
                      ),
                    ),
                  ),
                  Positioned(
                    top: 20,
                    right: 20,
                    child: Container(
                      padding: const EdgeInsets.symmetric(
                        horizontal: 12,
                        vertical: 7,
                      ),
                      decoration: BoxDecoration(
                        color: Colors.red,
                        borderRadius: BorderRadius.circular(20),
                      ),
                      child: const Text(
                        'NEW',
                        style: TextStyle(
                          color: Colors.white,
                          fontWeight: FontWeight.bold,
                        ),
                      ),
                    ),
                  ),
                  const Positioned(
                    left: 20,
                    right: 20,
                    bottom: 80,
                    child: Text(
                      'Learn Flutter Development',
                      style: TextStyle(
                        color: Colors.white,
                        fontSize: 28,
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                  ),
                  const Positioned(
                    left: 20,
                    right: 20,
                    bottom: 50,
                    child: Text(
                      'Build modern cross-platform applications.',
                      style: TextStyle(
                        color: Colors.white70,
                        fontSize: 15,
                      ),
                    ),
                  ),
                  Positioned(
                    left: 20,
                    bottom: 10,
                    child: ElevatedButton(
                      onPressed: () {},
                      child: const Text('Start Learning'),
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

34. Responsive Layered Design with LayoutBuilder

LayoutBuilder(
  builder: (context, constraints) {
    final isMobile = constraints.maxWidth < 600;

    return SizedBox(
      height: isMobile ? 280 : 400,
      width: double.infinity,
      child: Stack(
        children: [
          Positioned.fill(
            child: Container(
              decoration: const BoxDecoration(
                gradient: LinearGradient(
                  colors: [
                    Colors.indigo,
                    Colors.blue,
                  ],
                ),
              ),
            ),
          ),
          Positioned(
            left: isMobile ? 16 : 40,
            right: isMobile ? 16 : 40,
            bottom: isMobile ? 20 : 40,
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Text(
                  'Responsive Layered UI',
                  style: TextStyle(
                    color: Colors.white,
                    fontSize: isMobile ? 24 : 36,
                    fontWeight: FontWeight.bold,
                  ),
                ),
                const SizedBox(height: 10),
                Text(
                  isMobile
                      ? 'Mobile layout'
                      : 'Large screen layout',
                  style: const TextStyle(
                    color: Colors.white70,
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  },
)

35. Layered UI and Responsive Design

Layered interfaces should be designed with responsiveness in mind. Avoid placing every element using hard-coded coordinates when the content needs to work across different screen sizes.

  • Use Expanded and Flexible for flexible content.
  • Use LayoutBuilder for constraint-based layout decisions.
  • Use FractionallySizedBox for percentage-based sizing.
  • Use Align for general positioning.
  • Use Positioned for controlled placement inside Stack.
  • Use Wrap when content can move to multiple lines.
  • Use scrolling widgets when content can exceed available space.

36. Layered UI with Expanded

Stack can contain a Row or Column, and those layouts can use Expanded for responsive content.

Stack(
  children: [
    Positioned.fill(
      child: Container(
        color: Colors.indigo,
      ),
    ),
    Positioned(
      left: 20,
      right: 20,
      bottom: 20,
      child: Row(
        children: [
          Expanded(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: const [
                Text(
                  'Flutter',
                  style: TextStyle(
                    color: Colors.white,
                    fontSize: 24,
                  ),
                ),
                Text(
                  'Cross-platform development',
                  style: TextStyle(
                    color: Colors.white70,
                  ),
                ),
              ],
            ),
          ),
          const SizedBox(width: 12),
          ElevatedButton(
            onPressed: null,
            child: Text('Start'),
          ),
        ],
      ),
    ),
  ],
)

37. StackFit in Layered UI

The Stack fit property controls how non-positioned children are sized. Flutter provides values such as StackFit.loose, StackFit.expand, and StackFit.passthrough. :contentReference[oaicite:6]{index=6}

Stack(
  fit: StackFit.expand,
  children: [
    Container(
      color: Colors.blue,
    ),
    const Center(
      child: Text(
        'Expanded Background Layer',
        style: TextStyle(
          color: Colors.white,
          fontSize: 24,
        ),
      ),
    ),
  ],
)

38. Stack clipBehavior

The clipBehavior property determines whether content extending beyond the Stack's bounds is clipped.

Stack(
  clipBehavior: Clip.none,
  children: [
    Container(
      width: 200,
      height: 200,
      color: Colors.blue,
    ),
    Positioned(
      right: -30,
      top: -30,
      child: Container(
        width: 80,
        height: 80,
        decoration: const BoxDecoration(
          color: Colors.red,
          shape: BoxShape.circle,
        ),
      ),
    ),
  ],
)

Clip.none can be useful for badges or decorative elements that intentionally extend outside the main layer.

39. Animated Layered UI

Layered interfaces can be animated by changing the position, size, opacity, or appearance of individual layers.

AnimatedPositioned(
  duration: const Duration(milliseconds: 400),
  left: isOpen ? 20 : 250,
  bottom: 20,
  child: Container(
    width: 100,
    height: 100,
    color: Colors.blue,
  ),
)

This technique can be used for animated panels, menus, floating cards, badges, and interactive elements.

40. Layered UI with AnimatedOpacity

AnimatedOpacity(
  opacity: isVisible ? 1.0 : 0.0,
  duration: const Duration(milliseconds: 300),
  child: Container(
    padding: const EdgeInsets.all(20),
    color: Colors.black87,
    child: const Text(
      'Animated Layer',
      style: TextStyle(
        color: Colors.white,
      ),
    ),
  ),
)

41. Common Layered UI Mistakes

Mistake 1: Too Many Fixed Coordinates

Using large numbers of hard-coded top, left, right, and bottom values can make the design difficult to adapt to different screen sizes.

Mistake 2: Wrong Layer Order

If the overlay is added after the button, the overlay may paint over the button. Always verify the child order.

Mistake 3: No Constraints

A Stack needs appropriate constraints from its parent. Give it a meaningful size using a parent such as SizedBox, , or another constrained widget when necessary.

Mistake 4: Excessive Nesting

Deeply nested Stack widgets can make a UI difficult to understand and maintain. Use Stack only where overlapping is actually required.

Mistake 5: Ignoring Text Overflow

Long text placed in a small positioned area can overflow. Use appropriate constraints, maxLines, overflow, and flexible widgets.

Mistake 6: Poor Contrast

Text over images should have sufficient contrast. A gradient or semi-transparent overlay can help improve readability.

42. Best Practices for Layered UI

  1. Use Stack when elements genuinely need to overlap.
  2. Keep the layer hierarchy simple.
  3. Place background layers first.
  4. Place interactive foreground elements later in the child list.
  5. Use Positioned for intentional placement.
  6. Use Align when exact coordinates are unnecessary.
  7. Use Positioned.fill for full-area overlays.
  8. Use responsive constraints instead of excessive fixed dimensions.
  9. Use gradients to improve text readability over images.
  10. Use ClipRRect when rounded clipping is required.
  11. Test layered designs on small and large screens.
  12. Consider touch targets and accessibility for interactive layers.

43. Real-World Examples of Layered UI

Application AreaLayered UI Example
E-commerceProduct image + discount badge + favorite icon + product title
Social MediaProfile image + online badge + action buttons
Video AppsVideo + play button + progress controls
EducationCourse image + title + level badge + enroll button
DashboardBackground + statistics + icons + action controls
TravelDestination image + gradient + location + price
Food DeliveryFood image + offer badge + favorite button + restaurant information
BankingCard background + balance + card number + card controls

44. Interview Questions

Q1. What is layered UI?

Layered UI is a design approach in which multiple widgets are placed in the same visual area and displayed at different levels.

Q2. Which Flutter widget is commonly used for layered UI?

Stack is the primary Flutter widget for overlapping multiple children.

Q3. What does Positioned do?

Positioned controls the placement of a child within a Stack using properties such as top, right, bottom, left, width, and height.

Q4. What is Positioned.fill?

Positioned.fill is useful when a child should fill the available Stack area.

Q5. How does Stack determine the visual layer order?

Children are painted in order, with the first child at the bottom and later children above it. :contentReference[oaicite:7]{index=7}

Q6. What is the purpose of a gradient overlay?

A gradient overlay can improve the visual contrast between foreground content and a background image.

Q7. How can layered UI be made responsive?

Use constraints, flexible sizing, LayoutBuilder, FractionallySizedBox, alignment, responsive breakpoints, and appropriate scrolling rather than relying only on fixed coordinates.

Q8. What is FractionallySizedBox used for?

FractionallySizedBox can size its child to a fraction of the available width or height, which can be useful for responsive layers. :contentReference[oaicite:8]{index=8}

45. Practice Exercises

  1. Create a profile card with an image and online badge.
  2. Create a product card with a discount badge.
  3. Create a hero banner with an image, gradient, title, and button.
  4. Create a notification icon with a number badge.
  5. Create a video player interface with play and progress controls.
  6. Create a dashboard card with multiple visual layers.
  7. Create a loading overlay using Stack and CircularProgressIndicator.
  8. Create a responsive banner using Stack and LayoutBuilder.
  9. Create a decorative background using multiple positioned shapes.
  10. Create an animated layered card using AnimatedPositioned and AnimatedOpacity.

46. Quick Revision

Widget/ConceptPurpose
StackCreates overlapping layers.
PositionedPlaces a child relative to Stack edges.
Positioned.fillMakes a layer fill the available Stack area.
AlignPositions a child using Alignment.
ContainerCreates styled visual layers.
BoxDecorationProvides backgrounds, gradients, borders and shadows.
DecorationImagePlaces an image in a box decoration.
OpacityCreates transparent visual layers.
ClipRRectClips content using rounded rectangles.
FractionallySizedBoxSizes a child to a fraction of available space.
LayoutBuilderBuilds responsive layouts using parent constraints.
AnimatedPositionedAnimates changes in a positioned child's location.

47. Useful Flutter Documentation

48. Flutter Training Resources

For structured Flutter learning, practical development training, and course information, visit the following resources:

49. Summary

Creating layered UI designs in Flutter involves combining multiple widgets so that they occupy different visual levels. The Stack widget provides the basic layered layout, while Positioned provides controlled placement of individual elements.

Other widgets such as Align, Container, BoxDecoration, Opacity, ClipRRect, and FractionallySizedBox can be combined with Stack to create sophisticated interfaces. Responsive techniques such as LayoutBuilder, flexible constraints, and fractional sizing help ensure that layered designs remain usable across different screen sizes.

Layered UI is especially useful for image banners, profile cards, product cards, notification badges, dashboards, video interfaces, loading overlays, promotional sections, and modern Flutter applications.


Key Formula: Layered UI = Stack + Proper Layer Order + Positioned/Align + Visual Overlays + Responsive Constraints

whatsapp