【问题标题】:Under which circumstances textAlign property works in Flutter?什么情况下 textAlign 属性在 Flutter 中有效?
【发布时间】:2019-01-09 07:31:45
【问题描述】:

在下面的代码中,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 建议的这两种方法显然都不能“在野外”工作。这是我嵌套在行和列中的示例。第一种方法不对齐,第二种方法使应用程序崩溃:

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 作为 2 个子文本的容器?
  • 我为什么不呢?

标签: flutter text-alignment


【解决方案1】:

DefaultTextStyle 与问题无关。删除它只是使用默认样式,它比您使用的要大得多,所以它隐藏了问题。


textAlignText 占用的空间大于实际内容时对齐文本。

问题是,在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 将文本置于左侧。

【讨论】:

  • 但是你不同意吗,你所描述的只是技巧和变通方法,意味着图书馆的糟糕设计?
  • 这绝对不是技巧/解决方法。这是官方的解决方案。 Flutter 使用以组合为核心的基于约束的布局。就是Layout的函数式编程。真是太棒了
  • 在第一种情况下,您指定了两次“左”,在第二种情况下,您指定了无限宽度。这些绝对是技巧,尽管它们是官方的和实用的。
  • 抱歉,我忘记删除 Align 示例中的 textAlign。固定的。而flutter中的“无限宽度”只是说“我想要尽可能多的空间”。
  • 好的,那么第一种方法更好,尽管在这个简单的例子之外它仍然对我不起作用......
【解决方案2】:

在您的专栏中指定crossAxisAlignment: CrossAxisAlignment.start

【讨论】:

  • 不应该这样吗?:crossAxisAlignment: CrossAxisAlignment.start
  • 这行不通,因为他有一个文本小部件左对齐,一个右对齐...
  • @TSR 仅当列已经有一个元素占据整个宽度时才有效(例如,Row 可以工作,或者Align( ... centerLeft)
【解决方案3】:

textAlign 属性仅在为Text 的内容留出更多空间时才有效。下面是 2 个示例,显示 textAlign 何时有影响,何时没有影响。


没有影响

例如,在此示例中,它不会产生任何影响,因为Text 的内容没有额外的空间。

Text(
  "Hello",
  textAlign: TextAlign.end, // no impact
),


有影响

如果您将其包装在 Container 中并提供额外的 width 以使其具有更多额外空间。

Container(
  width: 200,
  color: Colors.orange,
  child: Text(
    "Hello",
    textAlign: TextAlign.end, // has impact
  ),
)

【讨论】:

  • 也可以使用Very \n Good Morning进行测试
【解决方案4】:

在 Colum 小部件中,文本对齐会自动居中,因此请使用crossAxisAlignment: CrossAxisAlignment.start 对齐开始。

Column( 
    crossAxisAlignment: CrossAxisAlignment.start, 
    children: <Widget>[ 
    Text(""),
    Text(""),
    ]);

【讨论】:

  • 由于解释准确,这应该是公认的答案。
【解决方案5】:

在容器中设置alignment: Alignment.centerRight

Container(
    alignment: Alignment.centerRight,
    child:Text(
       "Hello",
    ),
)

【讨论】:

    【解决方案6】:

    您可以使用容器,它会帮助您设置对齐方式。

    Widget _buildListWidget({Map reminder}) {
    return Container(
      color: Colors.amber,
      alignment: Alignment.centerLeft,
      padding: EdgeInsets.all(20),
      height: 80,
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          Container(
            alignment: Alignment.centerLeft,
            child: Text(
              reminder['title'],
              textAlign: TextAlign.left,
              style: TextStyle(
                fontSize: 16,
                color: Colors.black,
                backgroundColor: Colors.blue,
                fontWeight: FontWeight.normal,
              ),
            ),
          ),
          Container(
            alignment: Alignment.centerRight,
            child: Text(
              reminder['Date'],
              textAlign: TextAlign.right,
              style: TextStyle(
                fontSize: 12,
                color: Colors.grey,
                backgroundColor: Colors.blue,
                fontWeight: FontWeight.normal,
              ),
            ),
          ),
        ],
      ),
    );
    }
    

    【讨论】:

      【解决方案7】:

      为了获得最大的灵活性,我通常更喜欢像这样使用 SizedBox:

      Row(
                                      children: <Widget>[
                                        SizedBox(
                                            width: 235,
                                            child: Text('Hey, ')),
                                        SizedBox(
                                            width: 110,
                                            child: Text('how are'),
                                        SizedBox(
                                            width: 10,
                                            child: Text('you?'))
                                      ],
                                    )
      

      我过去在使用对齐时遇到过文本对齐问题,而 sizedbox 总是可以解决问题。

      【讨论】:

        【解决方案8】:

        您可以在脚手架或容器中除中心之外的任何位置对齐文本:-

        它适用于我的应用程序中的任何地方:-

        new Text(
        
                        "Nextperience",
        
        //i have setted in center.
        
                        textAlign: TextAlign.center,
        
        //when i want it left.
        
         //textAlign: TextAlign.left,
        
        //when i want it right.
        
         //textAlign: TextAlign.right,
        
                        style: TextStyle(
        
                            fontSize: 16,
        
                            color: Colors.blue[900],
        
                            fontWeight: FontWeight.w500),
        
                      ), 
        

        【讨论】:

          猜你喜欢
          • 2011-06-09
          • 1970-01-01
          • 2011-05-27
          • 2017-09-28
          • 2019-12-27
          • 1970-01-01
          • 1970-01-01
          • 2019-01-16
          • 1970-01-01
          相关资源
          最近更新 更多