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 小部件中(如错误消息中所述,通常为 MaterialAppWidgetsApp) 明确地,作为构造函数的参数:
Text(
    'Hello World',
    textDirection: TextDirection.ltr,
)

从长远来看,第二种方法显然无法管理。

【讨论】:

【参考方案2】:

如果您使用的是材质小部件组件,例如ScaffoldMaterial,则无需在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>

错误:在此 Directioner 小部件上方找不到正确的 Provider<User>

实现对 PaginatedDataTable Flutter 的排序