以下のコードでは、textAlign
プロパティは機能しません。上記のいくつかのレベルであるDefaultTextStyle
ラッパーを削除すると、textAlign
が機能し始めます。
常に機能するようにする理由と方法
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,)
],))
);
}
}
Remiによって提案された両方のアプローチは、明らかに「インザワイルド」では機能しません。行と列の両方にネストした例を次に示します。最初のアプローチでは調整が行われず、2番目のアプローチではアプリケーションがクラッシュします。
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
は問題とは無関係です。これを削除するには、デフォルトのスタイルを使用します。これは、使用したスタイルよりもはるかに大きいため、問題が隠されます。
textAlign
は、その占有スペースが実際のコンテンツよりも大きい場合に、Text
が占有するスペースでテキストを位置合わせします。
事は、Column
の中では、あなたのText
は最小限のスペースを取ります。 Column
がデフォルトでcrossAxisAlignment
に設定されているcenter
を使用して、その子を整列します。
このような動作をキャッチする簡単な方法は、次のようにテキストをラップすることです。
Container(
color: Colors.red,
child: Text(...)
)
あなたが提供したコードを使用して、以下をレンダリングします:
問題は突然明らかになります:Text
幅全体を取りませんColumn
.
これでいくつかの解決策があります。
Text
の動作を模倣するために、Align
をtextAlign
にラップできます。
Column(
children: <Widget>[
Align(
alignment: Alignment.centerLeft,
child: Container(
color: Colors.red,
child: Text(
"Should be left",
),
),
),
],
)
これは以下をレンダリングします:
または、Text
を強制的にColumn
幅に埋めることができます。
Column
でcrossAxisAlignment: CrossAxisAlignment.stretch
を指定するか、SizedBox
を無限に使用してwidth
を使用します。
Column(
children: <Widget>[
SizedBox(
width: double.infinity,
child: Container(
color: Colors.red,
child: Text(
"Should be left",
textAlign: TextAlign.left,
),
),
),
],
),
以下をレンダリングします:
その例では、テキストを左に配置したのはTextAlign
です。
列にcrossAxisAlignment: CrossAxisAlignment.start
を指定します
textAlign
プロパティは、Text
のコンテンツ用にさらにスペースが残っている場合にのみ機能します。以下に、textAlignに影響がある場合とない場合を示す2つの例を示します。
たとえば、この例では、Text
のコンテンツに余分なスペースがないため、影響はありません。
Text(
"Hello",
textAlign: TextAlign.end, // no impact
),
それをContainer
でラップし、余分なwidth
を提供して、より多くの余分なスペースがあるようにします。
Container(
width: 200,
color: Colors.orange,
child: Text(
"Hello",
textAlign: TextAlign.end, // has impact
),
)