我开发了自己的自定义小部件,用于其他 View 。在这个自定义小部件中,我有一个存储信息的类属性,假设这是一个在小部件内获得新项目的列表。现在我想从我的主小部件级别从这个列表中获取项目。
如何做到这一点?
我不想创建这样的变量: var customWidget = MyCustomWidget()
然后,获取像 customWidget.createState().myList
这样的内部变量 - 我认为这是一个糟糕的解决方案(我不确定它是否会起作用)。还将一个列表传递给我的自定义小部件的构造函数看起来很丑陋。
还有其他方法可以获取其他小部件的状态吗?
最佳答案
首先,请记住,在 Flutter 中数据只能向下传递。设计上无法访问 child 的数据,只能访问 parent 的数据(尽管周围有一些黑客攻击)。
从这一点来说,传递数据主要有2种解决方案:
我觉得这里没什么好说的。便于使用。但是,当您想将一个字段传递给所有小部件树时,这很无聊。仅当值的范围有限时才使用此方法。如果是配置或用户详细信息,请选择第二种解决方案。
class Bar extends StatelessWidget {
final String data;
Bar({this.data});
@override
Widget build(BuildContext context) {
return Text(data);
}
}
BuildContext
每个小部件都可以访问一个 BuildContext
。此类允许一个小部件使用以下方法之一从其任何祖先获取信息:
ancestorStateOfType(TypeMatcher)
ancestorWidgetOfExactType(Type)
...
事实上,如果有一个数据需要多次访问,首选inheritFromWidgetOfExactType
。
这里使用 InheritedWidget
;这些是特定类型的小部件,访问速度非常快。
见 Flutter: How to correctly use an Inherited Widget?有关其用法的更多详细信息
附带说明,还有第三种解决方案。这是GlobalKey
我不会详述太多细节,因为这更像是一种技巧,而不是一个适当的解决方案。 (见 Builder versus GlobalKey)
但基本上,它允许在 build
调用之外获取 any 小部件的状态/上下文。无论是 parent 还是 child 。
https://stackoverflow.com/questions/48910814/