Flutter 用换行对齐两个极端的文本小部件

Flutter align two text widgets on extremes with a wrap

我想连续放置两个文本小部件,一个在左边,一个在右边。如果文本太长,就会溢出。为了防止这种情况,我想在这种情况下显示正确的文本在下面一行。

这是我想要的:

这是我用 WrapAlignment.spaceBetweenWrap 小部件尝试过的方法:

@override
Widget build(BuildContext context) {
  return Wrap(
    alignment: WrapAlignment.spaceBetween,
    spacing: 16,
    children: <Widget>[
      Text('a long text on the left side', textAlign: TextAlign.start),
      Text('a long text on the right side', textAlign: TextAlign.end),
    ],
  );
}

但是,两个文本都位于左侧:

我已经尝试使用对齐小部件,但没有取得预期的成功。这是我尝试的代码:

Wrap(
  alignment: WrapAlignment.spaceBetween,
  spacing: 16,
  children: <Widget>[
    Align(alignment: Alignment.topLeft, child: Text('left side')),
    Align(alignment: Alignment.topRight, child: Text('right side')),
  ],
)

然而,这也没有产生预期的结果:

提前致谢。

I've found the solution here that works perfectly.

@override
Widget build(BuildContext context) {
  return LeftRightAlign(
    left: Text('left side',),
    right: Text('right side'),
  );
}

这是自定义 LeftRightAlign 小部件的代码:

import 'package:flutter/widgets.dart';
import 'package:flutter/rendering.dart';
import 'dart:math' as math;

class LeftRightAlign extends MultiChildRenderObjectWidget {
  LeftRightAlign({
    Key key,
    @required Widget left,
    @required Widget right,
  }) : super(key: key, children: [left, right]);

  @override
  RenderLeftRightAlign createRenderObject(BuildContext context) {
    return RenderLeftRightAlign();
  }
}

class LeftRightAlignParentData extends ContainerBoxParentData<RenderBox> {}

class RenderLeftRightAlign extends RenderBox
    with
        ContainerRenderObjectMixin<RenderBox, LeftRightAlignParentData>,
        RenderBoxContainerDefaultsMixin<RenderBox, LeftRightAlignParentData> {

  RenderLeftRightAlign({
    List<RenderBox> children,
  }) {
    addAll(children);
  }

  @override
  void setupParentData(RenderBox child) {
    if (child.parentData is! LeftRightAlignParentData)
      child.parentData = LeftRightAlignParentData();
  }

  @override
  void performLayout() {
    final BoxConstraints childConstraints = constraints.loosen();

    final RenderBox leftChild = firstChild;
    final RenderBox rightChild = lastChild;

    leftChild.layout(childConstraints, parentUsesSize: true);
    rightChild.layout(childConstraints, parentUsesSize: true);

    final LeftRightAlignParentData leftParentData = leftChild.parentData;
    final LeftRightAlignParentData rightParentData = rightChild.parentData;

    final bool wrapped =
        leftChild.size.width + rightChild.size.width > constraints.maxWidth;

    leftParentData.offset = Offset.zero;
    rightParentData.offset = Offset(
        constraints.maxWidth - rightChild.size.width,
        wrapped ? leftChild.size.height : 0);

    size = Size(
        constraints.maxWidth,
        wrapped
            ? leftChild.size.height + rightChild.size.height
            : math.max(leftChild.size.height, rightChild.size.height));
  }

  @override
  bool hitTestChildren(HitTestResult result, {Offset position}) {
    return defaultHitTestChildren(result, position: position);
  }

  @override
  void paint(PaintingContext context, Offset offset) {
    defaultPaint(context, offset);
  }
}

Jamens 的所有功劳(: