当前位置: 首页 > 面试题库 >

Flutter:从子级检索顶级状态将返回null

云联
2023-03-14
问题内容

我正在尝试使用.of()方法获取应用程序的顶级状态,类似于Scaffold.of()函数。这是(精简后的)代码:

class IApp extends StatefulWidget {    
  @override
  IAppState createState() => new IAppState();

  static IAppState of(BuildContext context) =>
    context.ancestorStateOfType(const TypeMatcher<IAppState>());
}

该应用程序使用runApp(新IApp)启动

此小部件创建一个主页:

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      // ommitted: some localization and theming details
      home: new HomePage(),
    );
  }

然后,我尝试从主页(StatefulWidget本身)访问State:

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      // ommited: some Scaffold properties such as AppBar
      // runtimeType not actual goal, but just for demonstration purposes
      body: new Text(IApp.of(context).runtimeType.toString()),
    );
  }

奇怪的是,当我将HomePage的代码放置 在与 IApp 相同的文件中
时,该代码可以工作,但只是一个额外的类。但是,当我将HomePage放置 在单独的文件中
(main.dart和homepage.dart相互导入)时,IApp.of(context)的返回值为null。

是什么原因造成的?我该如何解决?


问题答案:

TDLR :仅使用以下文件导入文件

import 'package:myApp/path/myFile.dart';

永远不要

import './myFile.dart';

这是由于dart如何解决进口问题。

您可能只有一个源文件,但是在构建过程中,存在某些重复项。

假设您正在使用“ myApp”。要导入文件,可以同时执行以下两项操作:

  • import 'relativePath/myFile.dart'
  • import 'package:myApp/path2/myFile.dart'

您会认为它们指向同一文件,对吗?但不是。其中之一将指向原始来源。而另一个将指向用于构建的临时文件。

当您开始混合使用两种解决方案时,问题就来了。因为对于编译器,这两个文件是 不同的
。这意味着IApp从中导入package:myApp/IApp不等于从中IApp导入相同relativePath/myApp/IApp

在您的情况下,您在小部件树中插入了一个IAppfrom,pakage:path但是您的IApp.of(context)使用已IAppState在本地解析。它们都有不同的runtimeType。因此const TypeMatcher<IAppState>()不会匹配。并且您的函数将返回null。

有一种非常简单的方法可以测试此行为。创建一个test.dart仅包含文件

class Test {
}

然后在您main.dart添加以下导入:

import 'package:myApp/test.dart' as Absolute;
import './test.dart' as Relative;

您最终可以通过以下方法进行测试:

new Relative.Test().runtimeType == new Absolute.Test().runtimeType

破坏者:结果是错误的



 类似资料:
  • index.js Button.js 我的问题是“如何从Button.js到index.js获取标志值”?(儿童对父母)。

  • 问题内容: 我本质上是在尝试做出回应,但是有一些问题。 这是档案 当你点击按钮A,在RadioGroup中组件需要去选择按钮B 。 “选定”仅表示来自状态或属性的className 这里是: 的来源并不重要,它具有触发原始DOM 事件的常规HTML单选按钮 预期流量为: 点击按钮“ A” 按钮“ A”触发本地DOM事件onChange,该事件一直持续到RadioGroup 调用RadioGroup

  • 我正在尝试制作一个很好的ApiWrapper组件来填充各种子组件中的数据。从我读到的所有内容来看,这应该是可行的:https://jsfidle.net/vinniejames/m1mesp6z/1/ 但由于某种原因,当父状态更改时,子组件似乎没有更新。 我是不是漏了什么?

  • 我有一个如下所示的graphql查询: 因此,名称和电子邮件将由名为详细信息的其余endpoint解析,但是地址字段需要由另一个名为地址的其余endpoint解析。>rest终结点还需要在中传递的(因为我的rest服务需要该字段)。我不确定,在这种情况下,我如何设计我的解析器? 同样,一个字段一旦解析,是否可以将数据发送到另一个字段?这在grapqhql中可能吗?

  • 问题内容: 我有一个带有提交按钮的表单。该表单调用一个onclick函数,该函数将某物的状态从false设置为true。然后,我想将此状态传递回父级,这样,如果为true,则呈现componentA;如果为false,则呈现componentB。 我会如何反应?我知道我需要使用状态或道具,但不确定如何使用它。这也与单向流动反应原理矛盾吗? ComponentA代码: 控制其显示内容的父组件: 问题

  • 我有一个表单,它有一个提交按钮。该表单调用一个函数onclick,该函数将某物的状态从false设置为true。然后我想把这个状态传递回父级,这样如果为true,它将呈现componentA,如果为false,它将呈现componentB。 我会如何反应呢?我知道我需要使用状态或道具,但不知道如何使用。这是否与单向流反应原理相矛盾?? 组件A代码: 控制其显示内容的父组件:

  • 我的反应结构是 在中有一个按钮,单击该按钮可通过家长向其兄弟姐妹发送消息。第一个孩子- 应用程序 选择研究 参与者表-这需要接收某个变量,例如在其状态中的

  • 问题内容: 我有两个组成部分: 第一个是父组件,它是通常的React组件。 第二个是孩子,它是功能组件。 我想将 Titles 的值(处于子状态)传递给父Component。这是我的 子组件 代码: 这是我的 父组件 : 这看起来很容易,但这是我第一次使用功能组件。你能帮我吗 ? 问题答案: React就是关于在组件树中向下流动的数据。如果您希望能够显示和/或修改彼此之间的共享状态,则应提升状态并