Nol*_*nce 1 layout styling flutter
我正在尝试为我的 Flutter 应用程序创建这样的东西:
现在我已经成功地得到一行文字,一条虚线和更大的文字。我似乎无法解决的最后一个问题是摆脱不同大小文本中的可变大小差距。
[编辑] 我的意思是让所有内容都在同一条红线上对齐:
看着这个答案,我想我可以做同样的事情并将所有文本放在定位堆栈中。然而,这打破了我的布局,给了我这个错误:
I/flutter (26439): The following assertion was thrown during performLayout():
I/flutter (26439): RenderFlex children have non-zero flex but incoming height constraints are unbounded.
I/flutter (26439): When a column is in a parent that does not provide a finite height constraint, for example if it is
I/flutter (26439): in a vertical scrollable, it will try to shrink-wrap its children along the vertical axis. Setting a
I/flutter (26439): flex on a child (e.g. using Expanded) indicates that the child is to expand to fill the remaining
I/flutter (26439): space in the vertical direction.
I/flutter (26439): These two directives are mutually exclusive. If a parent is to shrink-wrap its child, the child
I/flutter (26439): cannot simultaneously expand to fit its parent.
I/flutter (26439): Consider setting mainAxisSize to MainAxisSize.min and using FlexFit.loose fits for the flexible
I/flutter (26439): children (using Flexible rather than Expanded). This will allow the flexible children to size
I/flutter (26439): themselves to less than the infinite remaining space they would otherwise be forced to take, and
I/flutter (26439): then will cause the RenderFlex to shrink-wrap the children rather than expanding to fit the maximum
I/flutter (26439): constraints provided by the parent.
I/flutter (26439): The affected RenderFlex is:
I/flutter (26439): RenderFlex#c7fb1 relayoutBoundary=up8 NEEDS-LAYOUT NEEDS-PAINT
I/flutter (26439): The creator information is set to:
I/flutter (26439): Column ? Expanded ? Row ? Column ? Padding ? RepaintBoundary-[<0>] ? IndexedSemantics ?
I/flutter (26439): NotificationListener<KeepAliveNotification> ? KeepAlive ? AutomaticKeepAlive ? SliverList ?
I/flutter (26439): MediaQuery ? ?
I/flutter (26439): See also: https://flutter.dev/layout/
Run Code Online (Sandbox Code Playgroud)
这是我的相关代码:
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
Text('Salary Cap'),
// Stack( // Will cause error
// fit: StackFit.expand,
// children: <Widget>[
// Positioned(
// top: 0,
// left: 0,
// width: 200,
// child: Text('Salary Cap'),
// ),
// ],
// ),
Expanded(
child: Container(
width: double.infinity,
child: CustomPaint(painter: LineDashedPainter()),
),
),
RichText(
text: TextSpan(
children: <TextSpan>[
TextSpan(text: '\$'),
TextSpan(
text:
'${oCcy.format(salaryLimit)}',
style: Theme.of(context).textTheme.display1,
),
],
),
),
],
),
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?
小智 13
你可以你的这两行
crossAxisAlignment: CrossAxisAlignment.baseline,
textBaseline: TextBaseline.ideographic,
Run Code Online (Sandbox Code Playgroud)
我已经为您创建了一个示例,您可以自定义字体颜色等。
class MoneyRow extends StatelessWidget {
final String name;
final String ammout;
const MoneyRow({Key key, this.name, this.ammout}) : super(key: key);
@override
Widget build(BuildContext context) {
return Row(
children: <Widget>[
Text(name),
Expanded(child: DashedLine()),
_price(context)
],
);
}
Widget _price(BuildContext context) {
return RichText(
text: TextSpan(
text: "\$",
style: Theme.of(context)
.textTheme
.subhead
.copyWith(color: Colors.grey),
children: [
TextSpan(
text: ammout,
style: Theme.of(context)
.textTheme
.headline
.copyWith(color: Colors.black))
]));
}
}
class DashedLine extends StatelessWidget {
@override
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (context, constraints) {
final boxWidth = constraints.constrainWidth();
final dashWidth = 10.0;
final dashCount = (boxWidth / (2 * dashWidth)).floor();
return Row(
children: List.generate(dashCount, (_) {
return Text(".");
}),
mainAxisAlignment: MainAxisAlignment.spaceBetween,
);
},
);
}
}
Run Code Online (Sandbox Code Playgroud)
用法
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: new AppBar(
title: new Text("My Flutter App"),
backgroundColor: Colors.red,
),
body: Column(
children: <Widget>[
MoneyRow(
name: "Cash",
ammout: "300.3",
),
MoneyRow(
name: "Cash",
ammout: "300.3",
),
MoneyRow(
name: "Cash",
ammout: "300.3",
)
],
));
}
Run Code Online (Sandbox Code Playgroud)
或者
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: new AppBar(
title: new Text("My Flutter App"),
backgroundColor: Colors.red,
),
body: ListView.builder(
itemCount: 10,
itemBuilder: (context, index) {
return MoneyRow(name: "Money $index", ammout: "${index * 10}");
}));
}
Run Code Online (Sandbox Code Playgroud)
值得一提的是,虚线的灵感来自于这篇 SO 帖子