Flutter 颤振:为什么使用控制器而不是直接在小部件中注册事件监听器?

Flutter 颤振:为什么使用控制器而不是直接在小部件中注册事件监听器?,flutter,dart,controller,widget,Flutter,Dart,Controller,Widget,有时必须创建控制器,在小部件中注册它,然后在控制器中注册侦听器,这看起来像是过度工程。我试图理解为什么Flatter团队决定对一些小部件采用这种方式,即文本字段、列表视图,而对其他小部件,即按钮小部件,我们可以简单地在小部件本身中注册onPress listener,这显然更简单,需要更少的样板代码 与简单事件侦听器相比,有控制器更好吗?我认为这是因为S.O.L.I.D.的第一原则。这意味着单一责任。每个对象应负责其自身的特定功能TextField提供文本输入,ListView只提供项目浏览。如

有时必须创建控制器,在小部件中注册它,然后在控制器中注册侦听器,这看起来像是过度工程。我试图理解为什么Flatter团队决定对一些小部件采用这种方式,即文本字段、列表视图,而对其他小部件,即按钮小部件,我们可以简单地在小部件本身中注册onPress listener,这显然更简单,需要更少的样板代码


与简单事件侦听器相比,有控制器更好吗?

我认为这是因为S.O.L.I.D.的第一原则。这意味着
单一责任
。每个对象
应负责其自身的特定功能
TextField
提供文本输入,
ListView
只提供项目浏览。如果您需要一些其他(可选)数据,您需要询问负责该数据的其他人。事实上,它是一个控制器


从另一方面来说,这种方法提供了一些灵活性。您可以在运行时更改控制器。

控制器用于在小部件树的更高位置存储状态,以便父小部件既可以对其作出反应,也可以对其进行更改

在文本字段的情况下,当用户按下一个键,然后让父级构造应该显示的新文本并用它重建文本字段时,回调是不方便的。(这不仅仅是按键,因为您也可以粘贴文本。)因此文本字段存储文本,因此它总是知道要显示什么,并且onChange回调可以在用户更改文本后报告整个文本

但是,您可能也希望从父对象更改为文本。他们可以这样做,在这种情况下,父级必须使用新文本重建文本字段。但是,对于某些用例,如果您不只是想覆盖用户键入的内容,则父级还必须存储文本。这将复制国家

最后,让控制器拥有状态(文本)并允许父字段和文本字段更改和读取状态更简单

对于ScrollController,情况类似:scroll视图及其父视图可能都希望更改滚动位置。两个人可能都想读它(当然滚动视图是这样的)


控制器模式的另一个优点是“父”可以是几个更高的小部件,您只需通过中间小部件传递一个控制器,而不是几个回调和几条数据。

我明白了。所以基本上你们说的是——当我们需要在两个方向上传递信息时——从和到小部件——控制器被使用——因为它和它的小部件有“全双工连接”。当只有小部件需要报告一些信息时,例如当按下按钮时,事件侦听器就足够了。我想说,当小部件的状态复杂或与它的交互丰富或频繁时,使用控制器模式比回调和用新数据重建小部件更方便。