image

25 Jan 2026

9K

35K

Flutter Layout Tips: Stack & Align for Overlay Widgets

In Flutter, creating visually rich and dynamic user interfaces often involves placing widgets on top of one another. Whether you're adding a badge to an avatar, displaying a loading spinner over content, or creating a context menu, the Stack and Align widgets are your go-to tools for achieving precise overlay layouts.

This article dives into the power of Stack and Align, explaining how they work together to give you granular control over the positioning of overlay widgets, enhancing the interactivity and aesthetics of your Flutter applications.

Understanding the Stack Widget

The Stack widget in Flutter allows you to layer multiple widgets on top of each other. Think of it like a stack of papers: the first widget in the children list is at the bottom, and subsequent widgets are placed on top of it. By default, widgets within a Stack are aligned to the top-left corner of the stack.

Hereโ€™s a basic example demonstrating how Stack layers two containers:


import 'package:flutter/material.dart';

class SimpleStackExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Stack(
      children: [
        // Bottom layer: a large blue container
        Container(
          width: 200,
          height: 200,
          color: Colors.blue,
          child: Center(
            child: Text(
              'Background',
              style: TextStyle(color: Colors.white, fontSize: 20),
            ),
          ),
        ),
        // Top layer: a smaller red container
        Container(
          width: 100,
          height: 100,
          color: Colors.red,
          child: Center(
            child: Text(
              'Foreground',
              style: TextStyle(color: Colors.white, fontSize: 16),
            ),
          ),
        ),
      ],
    );
  }
}

In this example, the red container will partially cover the blue container because it's listed after it in the children array.

Leveraging the Align Widget

While Stack allows layering, it doesn't offer direct control over the position of individual children beyond their natural flow. This is where the Align widget comes into play. When a child of a Stack is wrapped with an Align widget, you can precisely position that child within the bounds of the Stack.

The Align widget takes an alignment property, which accepts an AlignmentGeometry. Common values include Alignment.topLeft, Alignment.center, Alignment.bottomRight, and so on. These predefined constants represent common positions within a widget's parent.

Let's modify our previous example to use Align:


import 'package:flutter/material.dart';

class StackWithAlignExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Stack(
      alignment: Alignment.center, // Optional: Align children in Stack by default
      children: [
        // Main content
        Container(
          width: 250,
          height: 250,
          color: Colors.lightBlue,
          child: Center(
            child: Text(
              'Main Content Area',
              style: TextStyle(color: Colors.white, fontSize: 22),
            ),
          ),
        ),
        // Overlay widget aligned to the bottom-right
        Align(
          alignment: Alignment.bottomRight,
          child: Container(
            width: 70,
            height: 70,
            decoration: BoxDecoration(
              color: Colors.red,
              shape: BoxShape.circle,
            ),
            child: Icon(Icons.notifications, color: Colors.white, size: 30),
          ),
        ),
        // Another overlay widget aligned to the top-left
        Align(
          alignment: Alignment.topLeft,
          child: Container(
            padding: EdgeInsets.all(8),
            color: Colors.green,
            child: Text(
              'New!',
              style: TextStyle(color: Colors.white, fontSize: 14),
            ),
          ),
        ),
      ],
    );
  }
}

In this code, the notification icon is precisely placed at the bottom-right, and the "New!" badge at the top-left, thanks to the Align widget.

Practical Application: Overlay Widgets

The combination of Stack and Align is incredibly powerful for creating various types of overlay widgets. Here are some common use cases:

  • Badges: Adding notification counts or status indicators to avatars or icons.
  • Loading Indicators: Displaying a progress spinner over content while data is being fetched.
  • Action Buttons: Placing floating action buttons (FABs) in custom positions.
  • Contextual Menus/Tooltips: Displaying small, temporary pop-ups relative to another widget.
  • Decorations: Adding corner ribbons or watermarks to images.

Let's create a profile picture with an online status badge using Stack and Align:


import 'package:flutter/material.dart';

class ProfileWithStatusBadge extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Stack(
        alignment: Alignment.center, // Align children of Stack by default
        children: [
          // Base widget: Profile Picture
          CircleAvatar(
            radius: 60,
            backgroundImage: NetworkImage('https://i.pravatar.cc/300?img=1'), // Example avatar image
            backgroundColor: Colors.grey[200],
          ),
          // Overlay widget: Online Status Badge
          Align(
            alignment: Alignment.bottomRight,
            child: Container(
              width: 30,
              height: 30,
              decoration: BoxDecoration(
                color: Colors.green, // Online status color
                shape: BoxShape.circle,
                border: Border.all(color: Colors.white, width: 3), // White border for visibility
              ),
              child: Center(
                child: Icon(Icons.circle, color: Colors.white, size: 10), // Small dot or similar icon
              ),
            ),
          ),
        ],
      ),
    );
  }
}

This example beautifully illustrates how Align allows us to place the green online badge precisely at the bottom-right corner of the avatar, creating a common UI pattern with minimal effort.

Advanced Positioning with FractionalOffset

While Alignment.center, Alignment.topLeft, etc., cover most cases, sometimes you need even more precise control. For this, Alignment takes two double values (x, y) ranging from -1.0 to 1.0, where (-1.0, -1.0) is the top-left, (1.0, 1.0) is the bottom-right, and (0.0, 0.0) is the center.

For even finer granularity, or when you want to position a child relative to its *own* size, you can use FractionalOffset. A FractionalOffset(dx, dy) represents an offset where (0.0, 0.0) is the top-left corner of the *child* and (1.0, 1.0) is its bottom-right, relative to the *parent*'s size.

For instance, to position an item slightly off-center:


Align(
  alignment: Alignment(0.2, -0.3), // Slightly right and up from center
  child: Text('Custom Pos'),
)

Or, using FractionalOffset if you need to consider the child's internal alignment reference:


Align(
  alignment: FractionalOffset(0.7, 0.7), // 70% from top-left, relative to child's own dimensions within parent
  child: Icon(Icons.star),
)

In most overlay scenarios within a Stack, `Alignment` with predefined constants or custom (x,y) values is sufficient. `FractionalOffset` offers a different perspective on how the alignment point is interpreted, usually more relevant for aligning the specific point of a child to a specific point of the parent.

Best Practices and Considerations

  • Order Matters: Remember that widgets are painted in the order they appear in the children list. The last widget will be on top.
  • Size Constraints: Stack tries to size itself to the largest non-positioned child. If all children are positioned (e.g., wrapped in Align or Positioned), the Stack will try to be as small as possible or expand to its parent's constraints. Consider wrapping your Stack in a SizedBox or Container if you need it to occupy a specific size.
  • Performance: For simple overlays, Stack and Align are highly performant. Avoid excessively deep or complex nested Stack structures if not necessary.
  • Positioned Widget: For absolute positioning with specific offsets (top, bottom, left, right, width, height), the Positioned widget is an alternative to Align within a Stack. Align is great for relative alignment, while Positioned is ideal for pixel-perfect or percentage-based distance from stack edges.
  • Responsiveness: Using Alignment constants or relative values (like Alignment(x,y)) often leads to more responsive layouts than hardcoded pixel values when the parent Stack's size changes.

Conclusion

The Stack and Align widgets are fundamental building blocks for creating sophisticated and flexible layouts in Flutter, especially when dealing with overlay elements. By mastering their combined capabilities, you can precisely control the placement of widgets, adding badges, indicators, and other dynamic UI components that greatly enhance the user experience and visual appeal of your applications. Experiment with these powerful widgets to unlock new possibilities in your Flutter UI designs.

Related Articles

May 14, 2026

Building a Multi-Event Countdown Timer Widget with Reminders, Notifications, Repeat, and Custom Labels in Flutter

Building a Multi-Event Countdown Timer Widget with Reminders, Notifications, Repeat, and Custom Labels in Flutter Countdown timers are essential in many applic

May 11, 2026

Unleashing Dynamic UIs: Flutter's Animation Prowess

Unleashing Dynamic UIs: Flutter's Animation Prowess for Slide & Scale Effects Flutter's declarative UI framework, combined with its powerful animation capabilit

May 11, 2026

Building a Product Detail Page Widget in Flutter with Related Items, Review Carousel, Promo Badges, and Quick Buy

Building a Product Detail Page Widget in Flutter with Related Items, Review Carousel, Promo Badges, and Quick Buy A well-designed Product Detail Page (PDP) is