[flutter] 어떤 상황에서 textAlign 속성이 Flutter에서 작동합니까?

아래 코드에서 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문제와 관련이 없습니다. 그것을 제거하는 것은 단순히 당신이 사용한 것보다 훨씬 큰 기본 스타일을 사용하여 문제를 숨 깁니다.


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.

crossAxisAlignment: CrossAxisAlignment.stretchon 을 지정 Column하거나 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이 영향을 미치는시기와 그렇지 않은 경우를 보여주는 두 가지 예입니다.


영향 없음

예를 들어,이 예에서는 .NET Framework의 콘텐츠를위한 추가 공간이 없기 때문에 영향을 미치지 않습니다 Text.

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

여기에 이미지 설명 입력


영향을 미침

당신이 그것을 포장 하고 더 많은 여분의 공간을 갖도록 Container여분을 제공 width하는 경우.

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

여기에 이미지 설명 입력


답변

Colum 위젯에서 텍스트 정렬은 자동으로 중앙에 배치되므로 crossAxisAlignment: CrossAxisAlignment.start시작 정렬에 사용하십시오 .

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


답변

alignment: Alignment.centerRight컨테이너에서 설정 :

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


답변

유연성을 극대화하기 위해 일반적으로 다음과 같이 SizedBox로 작업하는 것을 선호합니다.

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

과거에 정렬을 사용할 때 텍스트 정렬에 문제가 있었지만 sizedbox는 항상 작업을 수행합니다.


답변

컨테이너를 사용할 수 있으며 정렬을 설정하는 데 도움이 될 것입니다.

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,
          ),
        ),
      ),
    ],
  ),
);
}