在 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。此类允许一个小部件使用以下方法之一从其任何祖先获取信息:

inheritFromWidgetOfExactType(Type)

ancestorStateOfType(TypeMatcher)

ancestorWidgetOfExactType(Type)

...

事实上,如果有需要多次访问的数据,首选inheritFromWidgetOfExactType

这使用InheritedWidget;这些是特定类型的小部件,访问速度非常快。

请参阅Flutter: How to correctly use an Inherited Widget? 了解有关其用法的更多详细信息


附带说明,还有第三种解决方案。这是GlobalKey

我不会详述太多细节,因为这更像是一种技巧,而不是一个适当的解决方案。 (见Builder versus GlobalKey)

但基本上,它允许在build 调用之外获取任何 小部件的状态/上下文。无论是父母还是孩子

【讨论】:

第一句话是我找了几个小时。谢谢。

以上是关于在 Flutter 中的小部件之间传递数据的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何在构造函数中传递值,以便我可以重用我的小部件?

Flutter:如何在两个小部件之间传递相同的数据?

Flutter - 如何拥有任意数量的隐式动画

Flutter:如何将图像(裁剪)放入下一个有状态/更少的小部件

如何在 Flutter 中的小部件下设置所有 Text 小部件的颜色?

如何将 Taps 传递给顶部小部件下方的小部件?