我开发了自己的自定义小部件,用于其他视图。在这个自定义小部件中,我有一个存储信息的类属性,假设这是一个获取小部件内新项的列表。现在我想从我的主要小部件的级别获取此列表中的项目。
怎么做?我不想创建这样的变量:var customWidget = MyCustomWidget()
然后,得到像customWidget.createState().myList
这样的内部变量 - 我认为这是一个可怕的解决方案(我不确定它是否会起作用)。将列表传递给我的自定义小部件的构造函数看起来非常难看。
有没有其他方法来获得其他小部件的状态?
首先,请记住,Flutter数据只能向下传递。根据设计,不可能访问儿童的数据,只有父母的数据(尽管周围有一些黑客)。
从这一点来看,传递数据有两种主要解决方案:
我认为这里没有太多要说的。使用方便。但是当你想将一个字段传递给所有小部件树时很无聊。仅在值的范围有限时才使用此方法。如果它类似于配置或用户详细信息,请转到第二个解决方案。
class Bar extends StatelessWidget {
final String data;
Bar({this.data});
@override
Widget build(BuildContext context) {
return Text(data);
}
}
BuildContext
每个小部件都可以访问BuildContext
。此类允许一个窗口小部件使用以下方法之一从其任何祖先获取信息:
事实上,如果需要多次访问数据,请选择inheritFromWidgetOfExactType
。
这使用InheritedWidget
;这是特定类型的小部件,访问速度极快。
有关其用法的更多详细信息,请参阅Flutter: How to correctly use an Inherited Widget?
作为旁注,有第三种解决方案。这是GlobalKey
我不会涉及太多细节,因为这更像是一个黑客而不是一个正确的解决方案。 (见Builder versus GlobalKey)
但基本上,它允许获取build
调用之外的任何小部件的状态/上下文。无论是父母还是孩子。