【问题标题】:Flutter: No Directionality widget foundFlutter:找不到方向性小部件
【发布时间】: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 中一切都是小部件,所以任何小部件都应该为我们工作。

【问题讨论】:

    标签: dart 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 之前没有使用任何材质小部件,那么我们需要明确指定文本样式。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-11-06
              • 1970-01-01
              • 2021-02-04
              • 2021-07-16
              • 2021-03-31
              • 2021-07-22
              • 1970-01-01
              相关资源
              最近更新 更多