Flutter 用换行对齐两个极端的文本小部件
Flutter align two text widgets on extremes with a wrap
我想连续放置两个文本小部件,一个在左边,一个在右边。如果文本太长,就会溢出。为了防止这种情况,我想在这种情况下显示正确的文本在下面一行。
这是我想要的:
这是我用 WrapAlignment.spaceBetween
和 Wrap
小部件尝试过的方法:
@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 的所有功劳(:
我想连续放置两个文本小部件,一个在左边,一个在右边。如果文本太长,就会溢出。为了防止这种情况,我想在这种情况下显示正确的文本在下面一行。
这是我想要的:
这是我用 WrapAlignment.spaceBetween
和 Wrap
小部件尝试过的方法:
@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 的所有功劳(: