Does Flutter Support Negative Margin ??

· 6 min read
Does Flutter Support Negative Margin
Does Flutter Support Negative Margin

A negative Margin is generally not needed but there are situations where it’s really useful. so in this article, we will see that does Flutter Support Negative Margin.

Does Flutter Support Negative Margin ??

In CSS, margins have various meanings in the various layout models, most commonly, they are one of several values that contribute to computing the offset that the block layout model uses to place subsequent children; a negative total margin in this case merely means the next child is placed above the bottom of the previous child instead of after it.

In Flutter, as in CSS, there are several layout models; however, there is currently no widget that is equivalent to the CSS block layout model (which supports margin collapsing, negative margins, skipping floats, etc).

Such a layout model could certainly be implemented, it just hasn’t been implemented yet, at least not in the framework itself.

To implement such a layout model, you would create a RenderBox descendant similar to RenderFlex or RenderListBody, probably providing a way to set the margins of each child using a ParentDataWidget in the same way that Flex children can have their flex configured using the Expanded widget.

Probably the most complicated part of designing a new layout model like this would be deciding how to handle overflow or underflow when the children are too big or too small to fit the constraints passed to this new layout render an object.

The RenderFlex render object has a way to distribute the space if the children underflow, and considers it an error if they overflow (in debug mode, this is shown by a yellow-and-black striped warning area and a message logged to the console); the RenderListBody render the object.

On the other hand, takes the view that the constraints must be unbounded in the main axis, which means you can basically only use this layout model inside a list (hence the name).

If writing a new layout model is not attractive, you could use one of the existing layout widgets that allow overlapping children. A stack is an obvious choice, where you set the explicit positions of each child and they can overlap arbitrarily this is vaguely similar to the CSS absolute position layout model. Another option is the CustomMultiChildLayout widget, which lets you layout and position each child in turn.

With this, you could position each child one after the other, simulating negative margins by setting the position of the subsequent child to a value that’s derived from the size and position of the previous child, but such that the subsequent child’s top is above the previous child’s bottom.

Flutter has a sophisticated but effective algorithm for rendering its widgets. Margins and Paddings are analyzed at runtime, and the final size and position of the widget are determined.

when you try to issue a negative margin you are purposefully creating a not valid layout where a widget is somehow dropping out of the space it is supposed to occupy.

The text can be pulled negatively outside its parent using a stack Consider a code snippet like the below:

Container(
  constraints: BoxConstraints.loose(Size.fromHeight(60.0)),
  decoration: BoxDecoration(color: Colors.black), 
  child: 
    Stack(
      alignment: Alignment.topCenter,
      overflow: Overflow.visible,
      children: [
        Positioned(
          top: 10.0,
          left: -15.0,
          right: -15.0,
          child: Text("OUTSIDE CONTAINER", style: TextStyle(color: Colors.red, fontSize: 24.0),)
        )
      ]
    )
)

The above code will generate output like the below:

Negative Margin in Flutter
Negative Margin in Flutter

No, Flutter does not allow negative margins but just in case you still want your widgets to overlap each other…

you can use a Stack with Positioned which will allow you to generate the layout which you can do with negative margins.

Consider a code snippet like the below:

import 'package:flutter/material.dart';

class MyHomePage extends StatefulWidget {
  MyHomePageState createState() => new MyHomePageState();
}

class MyHomePageState extends State<MyHomePage>  {


  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        body: new Center(
          child: new Container(
            padding: const EdgeInsets.all(8.0),
            height: 500.0,
            width: 500.0,
            child: new Stack(
              overflow: Overflow.visible,
              children: <Widget>[
                new Icon(Icons.pages, size: 36.0, color: Colors.red),
                new Positioned(
                  left: 20.0,
                  child: new Icon(Icons.pages, size: 36.0, color: Colors.green),
                ),

              ],
            ),
          ),
    )
    );
  }
}

void main() {
  runApp(new MaterialApp(
    title: 'Flutter Demo',
    theme: new ThemeData(
      primarySwatch: Colors.deepPurple,
    ),
    home: new MyHomePage(),
  ));
}

 

The container has a useful transform property. consider a code snippet like the below:

child: Container(
  color: Theme.of(context).accentColor,
  transform: Matrix4.translationValues(0.0, -50.0, 0.0),
)

Conclusion:

Thanks for being with us on a flutter journey !!!

So in this article, we have been through does flutter supports negative margin.

Do let us know if you are still confused about flutter development!! we’d love to help 🙂

Keep Learning !!! Keep Fluttering !!!

FlutterAgency.com is our portal Platform dedicated to Flutter Technology and Flutter Developers. The portal is full of cool resources from Flutter like Flutter Widget GuideFlutter ProjectsCode libs and etc.

FlutterAgency.com is one of the most popular online portals dedicated to Flutter Technology and daily thousands of unique visitors come to this portal to enhance their knowledge of Flutter.

Leave a Reply