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

问题描述 投票:14回答:1

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

怎么做?我不想创建这样的变量:var customWidget = MyCustomWidget()然后,得到像customWidget.createState().myList这样的内部变量 - 我认为这是一个可怕的解决方案(我不确定它是否会起作用)。将列表传递给我的自定义小部件的构造函数看起来非常难看。

有没有其他方法来获得其他小部件的状态?

dart flutter
1个回答
9
投票

首先,请记住,Flutter数据只能向下传递。根据设计,不可能访问儿童的数据,只有父母的数据(尽管周围有一些黑客)。

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

  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调用之外的任何小部件的状态/上下文。无论是父母还是孩子。

© www.soinside.com 2019 - 2024. All rights reserved.