在颤音中传递数据之间数据的最佳方法



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

该怎么做?我不想创建这样的变量: var customWidget = MyCustomWidget(),然后获取像 customWidget.createState().myList这样的内部变量 - 我认为这是一个可怕的解决方案(而且我不确定它是否有效(。还将列表传递给我的自定义小部件的构造函数看起来很丑陋。

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

首先,请记住,在颤音数据中只能向下传递。它是通过设计无法访问儿童的数据,只有父母(尽管周围有一些黑客(。

从这一点开始,有2个主要解决方案可以传递数据:

  1. 将想要的数据添加到您的小部件构造函数中。

我认为这里没有太多要说的。便于使用。但是,当您想将一个字段传递到所有小部件树时,无聊。仅当值的范围受到限制时,才使用此方法。如果是配置或用户详细信息,请选择第二个解决方案。

class Bar extends StatelessWidget {
  final String data;
  Bar({this.data});
  @override
  Widget build(BuildContext context) {
    return Text(data);
  }
}
  1. 使用Flutter的BuildContext

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

  • 继承fromwidgetofexacttype(type(
  • AncestorStateOfType(TypeMatcher(

  • ancestorWidgetOfexactType(type(

  • ...

作为事实,如果需要多次访问数据,则更喜欢inheritFromWidgetOfExactType

这使用InheritedWidget;这些是非常快速访问的小部件的细节。

请参阅Flutter:如何正确使用继承的小部件?有关其使用情况的更多详细信息


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

我不会详细介绍太多细节,因为这比适当的解决方案更像是黑客。(请参阅Builder与GlobalKey(

,但基本上,它允许在build呼叫之外获取任何小部件的状态/上下文。是父母或孩子

在我这边我实现了回调。

例如,在我的小部件中:

class ObjectiveCardWidget extends StatefulWidget {
  final Objective? objective;
  final ValueChanged<Objective?>? onChanged;
  ObjectiveCardWidget({this.objective, this.onChanged});
  @override
  State<ObjectiveCardWidget> createState() => _ObjectiveCardWidgetState();
}

当我的数据更新后,我刚刚称呼的自定义小部件:

widget.onChanged!(newValue);  // newvalue has been set previously

在我的parentwidget中,我像往常一样使用了更改:

ObjectiveCardWidget(
              objective: myObjective,
              onChanged: (value) {
                setState(() {
                  myObjective = value;
                });
              })

希望它会有所帮助。

相关内容

  • 没有找到相关文章

最新更新