Flutter:找不到方向性小部件
Posted
技术标签:
【中文标题】Flutter:找不到方向性小部件【英文标题】:Flutter: No Directionality widget found 【发布时间】:2019-10-01 00:52:17 【问题描述】:我在 android studio 中运行颤振代码时遇到异常。
I/flutter (5360): ══╡ 小部件库发现的异常 ╞═════════════════════════════════════════════════ ══════════ I/颤振 (5360):在构建文本(“xyz”)时引发了以下断言:I/flutter(5360):未找到方向性小部件。我/颤动 (5360):RichText 小部件需要一个方向性小部件祖先。 I/flutter (5360): 找不到的特定小部件 方向性祖先是:I/flutter(5360):RichText(softWrap: 以框宽度换行,maxLines:无限制,文本:“xyz”) I/flutter (5360):受影响小部件的所有权链是: I/flutter (5360): RichText ← 文本 ← 中心 ← 容器 ← [root] I/flutter (5360):通常会引入 Directionality 小部件 通过 I/flutter ( 5360) 处的 MaterialApp 或 WidgetsApp 小部件:顶部 您的应用程序小部件树。它确定环境读数 方向,用于 I/flutter (5360):例如,确定 如何布局文本,如何解释“开始”和“结束”值,以及 解决 I/flutter (5360): EdgeInsetsDirectional, AlignmentDirectional 和其他 *Directional 对象。
代码 sn-p:
import 'package:flutter/material.dart';
void main()
runApp(
Container(child: Center(child: Text("xyz"))),
);
我不知道为什么这个异常说
I/flutter (5360):通常,Directionality 小部件由 MaterialApp 或 WidgetsApp 小部件在 ...
因为在 Flutter 中一切都是小部件,所以任何小部件都应该为我们工作。
【问题讨论】:
【参考方案1】:文本小部件需要知道它应该从左到右还是从右到左显示文本。没有默认值。可以通过 2 种方式提供此信息:
通过将其嵌套在Directionality
小部件中(如错误消息中所述,通常为 MaterialApp
或 WidgetsApp
)
明确地,作为构造函数的参数:
Text(
'Hello World',
textDirection: TextDirection.ltr,
)
从长远来看,第二种方法显然无法管理。
【讨论】:
【参考方案2】:如果您使用的是材质小部件组件,例如Scaffold
、Material
,则无需在Text
小部件中指定textDirection
,因为在这些情况下会隐式提供Directionality
。因此,一个好的解决方案是使用:
Scaffold(body: Text("xyz"))
但如果你不使用它,你将不得不使用它
Text(
'xyz',
textDirection: TextDirection.ltr,
)
【讨论】:
【参考方案3】:如果您使用 Directionality 构造函数,您的问题将得到解决
Widget build(BuildContext context)
return Directionality(
textDirection: TextDirection.ltr,
child: Container(
color: myColor,
child: Center(
child: RaisedButton(
onPressed: ()
print('You pressed me');
changeColor();
,
child: Text('Click', textDirection: TextDirection.ltr)
),
),
),
);
【讨论】:
【参考方案4】:晚了,但我希望它可以帮助。 我也不使用任何预定义的根小部件。所以我将我的应用程序包装在主函数中的 Directionality 小部件中,并且颤振停止抱怨:
我的代码:
void main()
runApp(
new Directionality(textDirection: TextDirection.ltr, child: MyApp())
);
【讨论】:
【参考方案5】:对内部发生的事情进行更多详细说明。
当使用没有指定样式的 Text 小部件时,它会尝试自动从父级继承样式。这是Text Widget的build方法的前几行。
@override
Widget build(BuildContext context)
final DefaultTextStyle defaultTextStyle = DefaultTextStyle.of(context);
TextStyle? effectiveTextStyle = style;
if (style == null || style!.inherit)
effectiveTextStyle = defaultTextStyle.style.merge(style);
if (MediaQuery.boldTextOverride(context))
effectiveTextStyle = effectiveTextStyle!.merge(const TextStyle(fontWeight: FontWeight.bold));
看这行——final DefaultTextStyle defaultTextStyle = DefaultTextStyle.of(context);
现在,如果在 Text Widget 出现之前在 widget 树中使用了材质 widget,他们将已经设置了 Text widget 自动从 Build Context 继承的默认文本样式。如果在 Text 之前没有使用任何材质小部件,那么我们需要明确指定文本样式。
【讨论】:
以上是关于Flutter:找不到方向性小部件的主要内容,如果未能解决你的问题,请参考以下文章
Dart/flutter 小部件测试,无论是按键还是文本都找不到文本小部件
找不到正确的Provider在带有导航流的Flutter中,此Y小部件上方
在此 AddSupervisor 小部件上方找不到正确的 Provider<SupervisorProvider>