我开发了自己的自定义小部件,在其他视图中使用。在这个自定义小部件中,我有一个存储信息的类属性,让我们说这是一个获取小部件内新项目的列表。现在我想从我的主要小部件的级别获取此列表中的项目。
怎么做?
我不想创建这样的变量:var customWidget = MyCustomWidget()
然后,获取内部变量,如customWidget.createState().myList
- 我认为这是一个可怕的解决方案(我不确定是否它会工作)。将列表传递给我的自定义小部件的构造函数看起来非常难看。
还有其他方法可以获得其他小部件的状态吗?
答案 0 :(得分:9)
首先,请记住,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
调用之外获取任何小部件的状态/上下文。无论是父母还是孩子。