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
当占用空间大于实际内容时,对齐占用空间中的文本。
问题是,在 aColumn
中,您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.stretch
onColumn
或使用SizedBox
无限width
。
Column(
children: <Widget>[
SizedBox(
width: double.infinity,
child: Container(
color: Colors.red,
child: Text(
"Should be left",
textAlign: TextAlign.left,
),
),
),
],
),
呈现以下内容:
在该示例中,TextAlign
将文本放置在左侧。
推荐阅读
- c# - 如何使用 Cefsharp.wpf 共享屏幕?
- r - 在 R 中合并具有许多行名 == NA 的数据帧
- node.js - res.redirect 适用于 Postman,但不适用于 chrome
- python - 计算数据框中的绝对平均值
- c# - c# 即时创建实例的最少代码
- angular - Ionic 5 / Angular 9 - 将组件导入页面时出错
- react-native - React Native 的最佳广告中介(AdMob 除外)
- javascript - 获取数据时保存数据时useState、UseEffect出现问题
- html - 如何在加载时缩放图像的一部分?
- android - 使用 Kotlin 将多个 OnClickListener 添加到 RecyclerView