【问题标题】:The best way to passing data between widgets in Flutter在 Flutter 中的小部件之间传递数据的最佳方式
【发布时间】:2018-08-01 07:45:59
【问题描述】:

我开发了自己的自定义小部件,用于其他视图。在这个自定义小部件中,我有一个存储信息的类属性,假设这是一个在小部件内获得新项目的列表。现在我想从我的主小部件级别从这个列表中获取项目。

如何做到这一点? 我不想创建一个像这样的变量:var customWidget = MyCustomWidget(),然后得到像customWidget.createState().myList 这样的内部变量——我认为这是一个糟糕的解决方案(我不确定它是否会起作用)。还将一个列表传递给我的自定义小部件的构造函数看起来很丑陋。

还有其他方法可以获取其他小部件的状态吗?

【问题讨论】:

标签: dart flutter


【解决方案1】:

首先,请记住,在 Flutter 中数据只能向下传递。设计上无法访问孩子的数据,只能访问父母的数据(尽管周围有一些黑客攻击)。

从这一点来说,传递数据主要有2种解决方案:

  1. 将所需数据添加到小部件构造函数中。

我觉得这里没什么好说的。使用方便。但是,当您想将一个字段传递给所有小部件树时,这很无聊。仅当值的范围有限时才使用此方法。如果是配置或用户详细信息,请选择第二种解决方案。

class Bar extends StatelessWidget {
  final String data;

  Bar({this.data});

  @override
  Widget build(BuildContext context) {
    return Text(data);
  }
}
  1. 使用 Flutter 的 BuildContext

每个小部件都可以访问BuildContext。此类允许一个小部件使用以下方法之一从其任何祖先获取信息:

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

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

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


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

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

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

【讨论】:

  • 第一句话是我找了几个小时。谢谢。
猜你喜欢
  • 2019-04-22
  • 2018-11-10
  • 2020-12-03
  • 2014-01-27
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
相关资源
最近更新 更多