gpt4 book ai didi

dart - Flutter:从子项中检索顶级状态返回 null

转载 作者:IT王子 更新时间:2023-10-29 06:35:16 25 4
gpt4 key购买 nike

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

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

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

应用程序使用 runApp(new IApp) 启动

这个小部件创建一个主页:

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

然后,我尝试从 HomePage(一个 StatefulWidget 本身)访问状态:

  @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'

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

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

在您的例子中,您在小部件树中插入了一个 IApp来自 pakage:path但是你的IApp.of(context)使用 IAppState本地解决。它们都有不同的运行时类型。因此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

剧透:结果是假的

关于dart - Flutter:从子项中检索顶级状态返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47121411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com