在下面的代码中,textAlign属性不起作用。如果您删除DefaultTextStyle上面几个级别的包装器,则textAlign开始 工作。
textAlign
DefaultTextStyle
为什么以及如何确保它始终有效?
import 'package:flutter/material.dart'; void main() => runApp(new MyApp()); class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return new MaterialApp( title: 'Flutter Demo', theme: new ThemeData( primarySwatch: Colors.blue, ), home: new DefaultTextStyle(style: new TextStyle(fontSize: 10.0), child: new Column(children: <Widget>[ new Text("Should be left", textAlign: TextAlign.left,), new Text("Should be right", textAlign: TextAlign.right,) ],)) ); } }
雷米建议的两种方法显然都无法“在野外”工作。这 是我同时在行和列中嵌套的示例。第一种方法不 对齐,第二种方法使应用程序崩溃:
import 'package:flutter/material.dart'; void main() => runApp(new MyApp()); class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return new Directionality(textDirection: TextDirection.ltr, child: new DefaultTextStyle( style: new TextStyle(fontSize: 10.0, color: Colors.white), child: new Column(children: <Widget>[ new Row(children: <Widget>[ new Container(color: Colors.grey, child: new Column(children: <Widget>[ new Align(alignment: Alignment.centerLeft, child: new Text("left")), new Align(alignment: Alignment.centerRight, child: new Text("right")), ],)), new Container(color: Colors.grey, child: new Column(children: <Widget>[ new Align(alignment: Alignment.centerLeft, child: new Text("left")), new Align(alignment: Alignment.centerRight, child: new Text("right")), ],)), ],), /*new Row(children: <Widget>[ new Container(color: Colors.grey, child: new Column(children: <Widget>[ new SizedBox(width: double.infinity, child: new Text("left", textAlign: TextAlign.left,)), new SizedBox(width: double.infinity, child: new Text("right", textAlign: TextAlign.right)), ],)), new Container(color: Colors.grey, child: new Column(children: <Widget>[ new SizedBox(width: double.infinity, child: new Text("left", textAlign: TextAlign.left)), new SizedBox(width: double.infinity, child: new Text("right", textAlign: TextAlign.right)), ],)), ],)*/] ))); } }
即,文本居中,而忽略Align元素的对齐方式。
DefaultTextStyle与问题无关。删除它仅使用默认样式,该样式比您使用的默认样式大得多,因此隐藏了 问题。
textAlignText当占用的空间大于实际内容时,将文本对齐。
textAlignText
问题是,在内Column,您Text仅占用最小的空间。它是那么Column,使用对齐其子crossAxisAlignment,其默认为center。
crossAxisAlignment
center
捕获此类行为的一种简单方法是将文本包装成这样:
Container( color: Colors.red, child: Text(...) )
使用您提供的代码,呈现以下内容:
问题突然变得很明显:Text不要占用整个Column宽度。
您现在有一些解决方案。
您可以将自己包装Text成Align模仿textAlign行为
Text
Align
Column( children: <Widget>[ Align( alignment: Alignment.centerLeft, child: Container( color: Colors.red, child: Text( "Should be left", ), ), ), ], )
或者,您也可以强制Text填充Column宽度。
通过指定crossAxisAlignment: CrossAxisAlignment.stretchonColumn或SizedBox与infinite一起使用width。
crossAxisAlignment: CrossAxisAlignment.stretchonColumn
SizedBox与infinite
width
Column( children: <Widget>[ SizedBox( width: double.infinity, child: Container( color: Colors.red, child: Text( "Should be left", textAlign: TextAlign.left, ), ), ), ], ),
呈现以下内容:
在该示例中,就是TextAlign将文本放在左侧。