Search code examples
flutterdarttextrowoverflow

Flutter right overflow two texts in row


I want to put 2 Text in one Row. I do the following:

Row(crossAxisAlignment: CrossAxisAlignment.end, children: [
  Flexible(
      child: Text(text1,
          maxLines: 1,
          overflow: TextOverflow.ellipsis,
          textAlign: TextAlign.left)),
  Flexible(
      child: Text(text2,
          maxLines: 1,
          overflow: TextOverflow.ellipsis,
          textAlign: TextAlign.left)),
]),

Here I have shown the result expected with overflows and actual:

image

None of the Text can expand more than half the total length of the Row, even if there is free space. How to implement the result I expect, despite the fact that the length of Text1 and Text2 may be different?


Solution

  • You can use the length of the strings to split the area available to each one using calculated flex values in Flexible. The result will not always be optimal with non monospaced fonts, but somehow you have to assign how many space should the texts occupy. You could use Expanded to fill the remaining available space, but it only works if you have a fixed width item and use Expanded on the other one.

    Try this (setting width on the Container and red color is only for demonstration):

    class MyWidget extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        final text1 = 'Text111111111111111111';
        final text2 = 'Text222';
    
        return Container(
            width: 200,
            color: Colors.red,
            child: Row(crossAxisAlignment: CrossAxisAlignment.end, children: [
              Flexible(
                  flex: text1.length,
                  child: Text(text1,
                      maxLines: 1,
                      overflow: TextOverflow.ellipsis,
                      textAlign: TextAlign.left)),
              Flexible(
                  flex: text2.length,
                  child: Text(text2,
                      maxLines: 1,
                      overflow: TextOverflow.ellipsis,
                      textAlign: TextAlign.left)),
            ]));
      }
    }