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

时间:2018-02-21 16:27:31

标签: dart flutter

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

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

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

1 个答案:

答案 0 :(得分:9)

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

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

  1. 将所需数据添加到小部件构造函数中。
  2. 我认为这里没有太多要说的。使用方便。但是当你想将一个字段传递给所有小部件树时很无聊。仅在值的范围有限时才使用此方法。如果它类似于配置或用户详细信息,请转到第二个解决方案。

    class Bar extends StatelessWidget {
      final String data;
    
      Bar({this.data});
    
      @override
      Widget build(BuildContext context) {
        return Text(data);
      }
    }
    
    1. 使用Flutter的BuildContext
    2. 每个小部件都可以访问BuildContext。此类允许一个窗口小部件使用以下方法之一从其任何祖先获取信息:

      事实上,如果需要多次访问数据,请选择inheritFromWidgetOfExactType

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

      有关其使用情况的详细信息,请参阅Flutter: How to correctly use an Inherited Widget?

      作为旁注,有第三种解决方案。这是GlobalKey

      我不会涉及太多细节,因为这更像是一个黑客而不是一个正确的解决方案。 (见Builder versus GlobalKey

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