我有点困惑。大多数小部件没有控制器。很少有人(相机,文本框...)
使用相应控制器的目的是什么?我们为什么使用它?
答案 0 :(得分:4)
在颤动中,控制器是一种控制父窗口小部件的子状态的方法。
控制器的主要卖点是,它们无需使用GlobalKey
即可访问小部件状态。反过来,这使得做反模式工作和提高性能变得更加困难。
控制器还允许具有复杂的API,而无需在小部件上进行数千次回调。 他们还允许不“提升国家”,因为国家仍由孩子管理。
答案 1 :(得分:2)
控制器可用于自定义小部件的行为。 您可以传递控制器的自定义实现。
有时候,控制器所保持的状态与其所关联的小部件具有不同的生命周期,例如docs
答案 2 :(得分:0)
我想将Controllers视为一种以编程方式在您的应用中应用更改的方法,这些更改通常来自用户交互。控制器是可以附加到某些小部件的对象,然后可以使用这些对象控制该小部件的行为。让我们看一些例子:
使用ListView
时,可以附加ScrollController
来与ListView进行编程交互。也许您想在有人按下按钮时将ListView滚动到某个位置,或者想要有关列表中当前偏移量的信息。
另一个类似的示例是将PageController
附加到PageView
上。也许您的应用程序中发生了一些事情,您希望自动将其移至PageView的第一页。使用附加的PageController,您可以调用myPageController.animateToPage()
来做到这一点。
第三个示例是使用Google Maps库时,您可以附加GoogleMapController
并使用它执行各种操作,例如将地图移动到新坐标,缩放,旋转,添加标记,等
最后,要查看您提供的示例之一,在使用TextFormField
时,您可以附加TextEditingController
以获得有关当前值的信息,或者当“重置”按钮。
使用控制器时,建议的方法是将其保持在您的状态。下面的代码示例尚不完整,但是希望可以使您对如何初始化,附加和使用控制器(在本例中为PageController)有所了解。
class _ControllerDemoState extends State<ControllerDemo> {
/// Declare the variable to use.
PageController pageController;
@override
void initState() {
super.initState();
/// Instantiate the PageController in initState.
pageController = PageController();
}
/// When this method is called, we can use the pageController to automatically
/// animate the PageView to the first page.
void onButtonPress() {
pageController.animateToPage(
0,
curve: Curves.easeInOut,
duration: Duration(milliseconds: 200),
);
}
return PageView(
/// Attach the controller to the PageView.
controller: pageController,
children: [
...
]
),
}
正确使用Controllers是控制应用程序行为的非常有效的方法,值得进一步了解。祝你好运!