我开发了自己的自定义小部件,该小部件在其他视图中使用。在此自定义小部件中,我有一个存储信息的类属性,假设这是一个列表,它在小部件内获得了新项目。现在,我想从我的主要小部件级别中获取此列表中的项目。
该怎么做?我不想创建这样的变量: var customWidget = MyCustomWidget()
,然后获取像 customWidget.createState().myList
这样的内部变量 - 我认为这是一个可怕的解决方案(而且我不确定它是否有效(。还将列表传递给我的自定义小部件的构造函数看起来很丑陋。
还有其他方法可以获取其他小部件的状态吗?
首先,请记住,在颤音数据中只能向下传递。它是通过设计无法访问儿童的数据,只有父母(尽管周围有一些黑客(。
。从这一点开始,有2个主要解决方案可以传递数据:
- 将想要的数据添加到您的小部件构造函数中。
我认为这里没有太多要说的。便于使用。但是,当您想将一个字段传递到所有小部件树时,无聊。仅当值的范围受到限制时,才使用此方法。如果是配置或用户详细信息,请选择第二个解决方案。
class Bar extends StatelessWidget {
final String data;
Bar({this.data});
@override
Widget build(BuildContext context) {
return Text(data);
}
}
- 使用Flutter的
BuildContext
每个小部件都可以访问BuildContext
。此类允许一个小部件使用以下方法之一从任何祖先那里获取信息:
- 继承fromwidgetofexacttype(type(
AncestorStateOfType(TypeMatcher(
ancestorWidgetOfexactType(type(
...
作为事实,如果需要多次访问数据,则更喜欢inheritFromWidgetOfExactType
。
这使用InheritedWidget
;这些是非常快速访问的小部件的细节。
请参阅Flutter:如何正确使用继承的小部件?有关其使用情况的更多详细信息
作为旁注,有第三个解决方案。是GlobalKey
我不会详细介绍太多细节,因为这比适当的解决方案更像是黑客。(请参阅Builder与GlobalKey(
,但基本上,它允许在build
呼叫之外获取任何小部件的状态/上下文。是父母或孩子。
在我这边我实现了回调。
例如,在我的小部件中:
class ObjectiveCardWidget extends StatefulWidget {
final Objective? objective;
final ValueChanged<Objective?>? onChanged;
ObjectiveCardWidget({this.objective, this.onChanged});
@override
State<ObjectiveCardWidget> createState() => _ObjectiveCardWidgetState();
}
当我的数据更新后,我刚刚称呼的自定义小部件:
widget.onChanged!(newValue); // newvalue has been set previously
在我的parentwidget中,我像往常一样使用了更改:
ObjectiveCardWidget(
objective: myObjective,
onChanged: (value) {
setState(() {
myObjective = value;
});
})
希望它会有所帮助。