在 Flutter 中的小部件之间传递数据的最佳方式
Posted
技术标签:
【中文标题】在 Flutter 中的小部件之间传递数据的最佳方式【英文标题】:The best way to passing data between widgets in Flutter 【发布时间】:2018-08-01 07:45:59 【问题描述】:我开发了自己的自定义小部件,用于其他视图。在这个自定义小部件中,我有一个存储信息的类属性,假设这是一个在小部件内获得新项目的列表。现在我想从我的主小部件级别从这个列表中获取项目。
如何做到这一点?
我不想创建一个像这样的变量:var customWidget = MyCustomWidget()
,然后得到像customWidget.createState().myList
这样的内部变量——我认为这是一个糟糕的解决方案(我不确定它是否会起作用)。还将一个列表传递给我的自定义小部件的构造函数看起来很丑陋。
还有其他方法可以获取其他小部件的状态吗?
【问题讨论】:
还可以查看这些网站以获取架构示例/想法medium.com/@maksimrv/reactive-app-state-in-flutter-73f829bcf6a7github.com/brianegan/flutter_architecture_samples 嗨,不明白你是怎么解决的,你能帮我解决这个问题吗:***.com/questions/49824461/… 建议:您可以发布自己问题的答案,而不是发布对您的问题的更新,这样该问题就不会出现在“未回答的问题”中 【参考方案1】:首先,请记住,在 Flutter 中数据只能向下传递。设计上无法访问孩子的数据,只能访问父母的数据(尽管周围有一些黑客攻击)。
从这一点来说,传递数据主要有2种解决方案:
-
将所需数据添加到小部件构造函数中。
我觉得这里没什么好说的。使用方便。但是,当您想将一个字段传递给所有小部件树时,这很无聊。仅当值的范围有限时才使用此方法。如果是配置或用户详细信息,请选择第二种解决方案。
class Bar extends StatelessWidget
final String data;
Bar(this.data);
@override
Widget build(BuildContext context)
return Text(data);
-
使用 Flutter 的
BuildContext
每个小部件都可以访问BuildContext
。此类允许一个小部件使用以下方法之一从其任何祖先获取信息:
ancestorStateOfType(TypeMatcher)
ancestorWidgetOfExactType(Type)
...
事实上,如果有需要多次访问的数据,首选inheritFromWidgetOfExactType
。
这使用InheritedWidget
;这些是特定类型的小部件,访问速度非常快。
请参阅Flutter: How to correctly use an Inherited Widget? 了解有关其用法的更多详细信息
附带说明,还有第三种解决方案。这是GlobalKey
我不会详述太多细节,因为这更像是一种技巧,而不是一个适当的解决方案。 (见Builder versus GlobalKey)
但基本上,它允许在build
调用之外获取任何 小部件的状态/上下文。无论是父母还是孩子。
【讨论】:
第一句话是我找了几个小时。谢谢。以上是关于在 Flutter 中的小部件之间传递数据的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章
Flutter:如何在构造函数中传递值,以便我可以重用我的小部件?
Flutter:如何将图像(裁剪)放入下一个有状态/更少的小部件