dart - 在 Flutter 中的小部件之间传递数据的最佳方式

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

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

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

最佳答案

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

从这一点来说,传递数据主要有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(Type)
  • ancestorStateOfType(TypeMatcher)

  • ancestorWidgetOfExactType(Type)

  • ...

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

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

见 Flutter: How to correctly use an Inherited Widget?有关其用法的更多详细信息


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

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

但基本上,它允许在 build 调用之外获取 any 小部件的状态/上下文。无论是 parent 还是 child

https://stackoverflow.com/questions/48910814/

相关文章:

flutter - 禁用 TabBar flutter 中的滑动标签

dart - Flutter:忽略小部件上的触摸事件

flutter - 自定义卡片形状 Flutter SDK

Flutter - TabBarView 内部的 ListView 失去滚动位置

dart - 未找到方向性小部件

dart - 在 flutter 中以编程方式关闭模态底部表

dart - 如何确定 Flutter 中图像的宽度和高度?

flutter - Flutter 支持负边距吗?

dart - Flutter 中的装饰图像模糊

dart - Flutter 中具有 Snap 效果的水平滚动卡片